@aginies/webuikit 0.2.0 → 0.3.0

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/approval/approval-client.ts","../src/approval/approval-panel.tsx","../src/core/index.tsx","../src/provider.tsx","../src/i18n.ts","../src/chat/chat-widget.tsx","../src/chat/markdown.tsx","../src/chat/structured-ui.tsx","../src/observability/index.tsx","../src/run/agent-runner.tsx","../src/run/run-client.ts"],"sourcesContent":["/**\n * Thin browser client for the Aginies platform: activation handshake, hosted-chat\n * configuration and streaming chat turns. No framework dependency; the React layer\n * wraps it.\n */\n\nexport interface AginiesConfig {\n /** Platform origin, e.g. `https://app.example.com`. No trailing slash. */\n baseUrl: string\n /** Activation token issued for the deployment. Without it nothing renders. */\n token: string\n /** UI language. Defaults to the document language, then English. */\n locale?: 'tr' | 'en'\n /** Fetch implementation override (tests, SSR). */\n fetch?: typeof fetch\n}\n\nexport interface ActivationConfig {\n apiBase: string\n brand: { name: string; logoUrl: string | null }\n theme: Record<string, string | undefined> | null\n /** Widget modules the activation unlocks; empty means all. */\n modules?: string[]\n /** The tenant a tenant key belongs to. Absent for a static activation key. */\n tenant?: { id: string; name: string }\n}\n\n/**\n * The session a tenant key buys: a short-lived bearer the client sends on every\n * platform call and renews by re-activating when it is refused.\n */\nexport interface ActivationSession {\n token: string\n /** Unix seconds. */\n expiresAt: number\n}\n\nexport type ActivationState =\n | { status: 'idle' }\n | { status: 'activating' }\n | { status: 'active'; config: ActivationConfig }\n | { status: 'rejected'; reason: string }\n\nexport interface ChatConfig {\n id: string\n title: string\n description: string\n customizations: {\n primaryColor?: string\n welcomeMessage?: string\n imageUrl?: string\n logoUrl?: string\n headerText?: string\n }\n authType: 'public' | 'password' | 'email' | 'sso'\n outputConfigs?: Array<{ blockId: string; path?: string }>\n}\n\nexport interface ChatAuthRequired {\n authRequired: ChatConfig['authType']\n title?: string\n description?: string\n}\n\nexport interface ChatFilePayload {\n name: string\n type: string\n size: number\n data: string\n lastModified?: number\n}\n\nexport interface SendMessageInput {\n input?: string\n conversationId?: string\n password?: string\n email?: string\n files?: ChatFilePayload[]\n}\n\n/** One server-sent event from a chat turn, already decoded. */\nexport type ChatStreamEvent =\n | { type: 'chunk'; blockId?: string; text: string }\n | { type: 'final'; data: unknown }\n | { type: 'error'; message: string }\n | { type: 'done' }\n\nexport class AginiesError extends Error {\n readonly status: number\n readonly code?: string\n constructor(message: string, status: number, code?: string) {\n super(message)\n this.name = 'AginiesError'\n this.status = status\n this.code = code\n }\n}\n\nconst trimSlash = (s: string) => s.replace(/\\/+$/, '')\n\nexport class AginiesClient {\n readonly baseUrl: string\n readonly token: string\n readonly locale: 'tr' | 'en'\n private readonly fetchImpl: typeof fetch\n private state: ActivationState = { status: 'idle' }\n private listeners = new Set<(s: ActivationState) => void>()\n private activation: Promise<ActivationState> | null = null\n private session: ActivationSession | null = null\n\n constructor(config: AginiesConfig) {\n if (!config?.baseUrl) throw new AginiesError('baseUrl is required', 0, 'MISSING_BASE_URL')\n if (!config?.token) throw new AginiesError('token is required', 0, 'MISSING_TOKEN')\n this.baseUrl = trimSlash(config.baseUrl)\n this.token = config.token\n this.locale = config.locale ?? detectLocale()\n this.fetchImpl = config.fetch ?? ((...args) => fetch(...args))\n }\n\n getState(): ActivationState {\n return this.state\n }\n\n subscribe(listener: (s: ActivationState) => void): () => void {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n private setState(next: ActivationState) {\n this.state = next\n for (const l of this.listeners) l(next)\n }\n\n /**\n * Runs the activation handshake once and caches the outcome. Components render only\n * while the state is `active`; a rejected activation is final for this client.\n */\n activate(): Promise<ActivationState> {\n if (this.activation) return this.activation\n this.setState({ status: 'activating' })\n this.activation = (async () => {\n try {\n const res = await this.fetchImpl(`${this.baseUrl}/api/ui/activate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token: this.token }),\n })\n if (!res.ok) {\n const body = await safeJson(res)\n const reason = (body && (body.error as string)) || `HTTP ${res.status}`\n this.setState({ status: 'rejected', reason })\n return this.state\n }\n const body = (await res.json()) as {\n activated?: boolean\n config?: ActivationConfig\n session?: ActivationSession\n }\n if (!body.activated || !body.config) {\n this.setState({ status: 'rejected', reason: 'Activation refused' })\n return this.state\n }\n this.session = body.session ?? null\n this.setState({ status: 'active', config: body.config })\n return this.state\n } catch (err) {\n this.setState({\n status: 'rejected',\n reason: err instanceof Error ? err.message : 'Activation failed',\n })\n return this.state\n }\n })()\n return this.activation\n }\n\n private assertActive() {\n if (this.state.status !== 'active') {\n throw new AginiesError('Client is not activated', 0, 'NOT_ACTIVATED')\n }\n }\n\n /** The current tenant session, if the activation issued one. */\n getSession(): ActivationSession | null {\n return this.session\n }\n\n /** Whether `module` may render under this activation. */\n hasModule(module: string): boolean {\n if (this.state.status !== 'active') return false\n const modules = this.state.config.modules ?? []\n return modules.length === 0 || modules.includes(module)\n }\n\n /**\n * Re-runs the handshake to obtain a fresh session. Used when a call is refused with\n * an expired bearer; the activation state stays `active` unless the platform now\n * rejects the key.\n */\n private async renewSession(): Promise<boolean> {\n this.activation = null\n const state = await this.activate()\n return state.status === 'active' && this.session !== null\n }\n\n private withSession(init: RequestInit): RequestInit {\n if (!this.session) return init\n const headers = new Headers(init.headers ?? {})\n if (!headers.has('Authorization')) headers.set('Authorization', `Bearer ${this.session.token}`)\n return { ...init, headers }\n }\n\n /**\n * A platform request carrying cookies and, when a tenant session exists, its bearer.\n * A 401/403 on a session that has expired triggers one renewal and one retry.\n */\n private async request(path: string, init: RequestInit = {}): Promise<Response> {\n const url = `${this.baseUrl}${path.startsWith('/') ? path : `/${path}`}`\n const send = () => this.fetchImpl(url, this.withSession({ credentials: 'include', ...init }))\n let res = await send()\n if (\n this.session &&\n (res.status === 401 || res.status === 403) &&\n this.session.expiresAt * 1000 <= Date.now() + 5_000\n ) {\n if (await this.renewSession()) res = await send()\n }\n return res\n }\n\n /** A raw request against the platform for endpoints the client does not wrap. */\n fetchRaw(path: string, init: RequestInit = {}): Promise<Response> {\n this.assertActive()\n return this.request(path, init)\n }\n\n /** Hosted-chat configuration. Resolves to an auth requirement instead of throwing on 401. */\n async getChat(identifier: string): Promise<ChatConfig | ChatAuthRequired> {\n this.assertActive()\n const res = await this.request(`/api/chat/${encodeURIComponent(identifier)}`)\n const body = await safeJson(res)\n if (res.status === 401 && body && typeof body.authRequired === 'string') {\n return body as unknown as ChatAuthRequired\n }\n if (!res.ok) {\n throw new AginiesError((body?.error as string) || `HTTP ${res.status}`, res.status)\n }\n return body as unknown as ChatConfig\n }\n\n /**\n * Sends one turn and yields the streamed events. Authentication for password / e-mail\n * chats travels in the same body on the first call; the platform then sets a cookie.\n */\n async *sendMessage(\n identifier: string,\n input: SendMessageInput,\n signal?: AbortSignal\n ): AsyncGenerator<ChatStreamEvent> {\n this.assertActive()\n const res = await this.request(`/api/chat/${encodeURIComponent(identifier)}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n signal,\n })\n if (!res.ok) {\n const body = await safeJson(res)\n if (res.status === 401 && body && typeof body.authRequired === 'string') {\n throw new AginiesError('Authentication required', 401, 'AUTH_REQUIRED')\n }\n throw new AginiesError((body?.error as string) || `HTTP ${res.status}`, res.status)\n }\n const contentType = res.headers.get('content-type') ?? ''\n if (!contentType.includes('text/event-stream')) {\n const body = await safeJson(res)\n yield { type: 'final', data: body }\n yield { type: 'done' }\n return\n }\n yield* parseSSE(res.body as ReadableStream<Uint8Array>)\n }\n}\n\n/** Parses an SSE body into chat events. Exported for tests. */\nexport async function* parseSSE(\n stream: ReadableStream<Uint8Array>\n): AsyncGenerator<ChatStreamEvent> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n let sep = buffer.indexOf('\\n\\n')\n while (sep !== -1) {\n const frame = buffer.slice(0, sep)\n buffer = buffer.slice(sep + 2)\n const event = decodeFrame(frame)\n if (event) yield event\n sep = buffer.indexOf('\\n\\n')\n }\n }\n const tail = decodeFrame(buffer)\n if (tail) yield tail\n } finally {\n reader.releaseLock()\n }\n yield { type: 'done' }\n}\n\nfunction decodeFrame(frame: string): ChatStreamEvent | null {\n const line = frame.split('\\n').find((l) => l.startsWith('data:'))\n if (!line) return null\n const data = line.slice(5).trim()\n if (!data || data === '[DONE]') return null\n let json: Record<string, unknown>\n try {\n json = JSON.parse(data)\n } catch {\n return { type: 'chunk', text: data }\n }\n if (json.event === 'error') {\n return { type: 'error', message: (json.error as string) || 'Stream error' }\n }\n if (json.event === 'final') {\n return { type: 'final', data: json.data }\n }\n if (typeof json.chunk === 'string') {\n return { type: 'chunk', blockId: json.blockId as string | undefined, text: json.chunk }\n }\n return null\n}\n\nasync function safeJson(res: Response): Promise<Record<string, unknown> | null> {\n try {\n return (await res.json()) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nfunction detectLocale(): 'tr' | 'en' {\n if (typeof document !== 'undefined') {\n const lang = document.documentElement.lang?.toLowerCase() ?? ''\n if (lang.startsWith('tr')) return 'tr'\n }\n if (typeof navigator !== 'undefined' && navigator.language?.toLowerCase().startsWith('tr')) {\n return 'tr'\n }\n return 'en'\n}\n","/**\n * Human-in-the-loop approvals. A run that reaches a \"Human in the Loop\" block pauses;\n * the platform stores its state and hands out a resume link. This module reads the\n * paused execution (`GET /api/resume/:workflowId/:executionId[/:contextId]`) and resumes\n * it with the approver's input (`POST …/:contextId`), through the activated client so a\n * tenant session travels along.\n */\nimport { type AginiesClient, AginiesError } from '../client'\n\nexport type ResumeStatus = 'paused' | 'resumed' | 'failed' | 'queued' | 'resuming'\n\nexport interface ResumeQueueEntry {\n id: string\n contextId: string\n status: string\n queuedAt: string | null\n claimedAt: string | null\n completedAt: string | null\n failureReason: string | null\n newExecutionId: string\n resumeInput: unknown\n}\n\nexport interface PausePoint {\n contextId: string\n triggerBlockId: string\n /** The block's paused output; `data.inputFormat` describes the approver's form. */\n response: { data?: Record<string, unknown> } | null\n registeredAt: string\n resumeStatus: ResumeStatus\n snapshotReady: boolean\n queuePosition?: number | null\n latestResumeEntry?: ResumeQueueEntry | null\n}\n\nexport interface PausedExecution {\n id: string\n workflowId: string\n executionId: string\n status: string\n totalPauseCount: number\n resumedCount: number\n pausedAt: string | null\n updatedAt: string | null\n expiresAt: string | null\n metadata: Record<string, unknown> | null\n pausePoints: PausePoint[]\n queue?: ResumeQueueEntry[]\n}\n\nexport interface PauseContext {\n execution: PausedExecution\n pausePoint: PausePoint\n queue: ResumeQueueEntry[]\n activeResumeEntry?: ResumeQueueEntry | null\n}\n\nexport interface ResumeOutcome {\n status: 'started' | 'queued'\n executionId: string\n queuePosition?: number | null\n message?: string\n}\n\n/** One field of the approver's form, as the block author configured it. */\nexport interface ResumeField {\n id: string\n name: string\n label: string\n type: string\n description?: string\n placeholder?: string\n value?: unknown\n required: boolean\n options?: unknown[]\n rows?: number\n}\n\nconst path = (workflowId: string, executionId: string, contextId?: string) =>\n `/api/resume/${encodeURIComponent(workflowId)}/${encodeURIComponent(executionId)}${\n contextId ? `/${encodeURIComponent(contextId)}` : ''\n }`\n\nasync function readJson<T>(res: Response): Promise<T> {\n let body: unknown = null\n try {\n body = await res.json()\n } catch {\n /* not JSON */\n }\n if (!res.ok) {\n const error = (body as { error?: string } | null)?.error\n throw new AginiesError(\n error || `HTTP ${res.status}`,\n res.status,\n res.status === 404 ? 'NOT_FOUND' : res.status === 403 ? 'FORBIDDEN' : undefined\n )\n }\n return body as T\n}\n\nexport function getPausedExecution(\n client: AginiesClient,\n workflowId: string,\n executionId: string\n): Promise<PausedExecution> {\n return client.fetchRaw(path(workflowId, executionId)).then((r) => readJson<PausedExecution>(r))\n}\n\nexport function getPauseContext(\n client: AginiesClient,\n workflowId: string,\n executionId: string,\n contextId: string\n): Promise<PauseContext> {\n return client\n .fetchRaw(path(workflowId, executionId, contextId))\n .then((r) => readJson<PauseContext>(r))\n}\n\nexport function listPausedExecutions(\n client: AginiesClient,\n workflowId: string,\n status?: string\n): Promise<PausedExecution[]> {\n const query = status ? `?status=${encodeURIComponent(status)}` : ''\n return client\n .fetchRaw(`/api/workflows/${encodeURIComponent(workflowId)}/paused${query}`)\n .then((r) => readJson<{ pausedExecutions: PausedExecution[] }>(r))\n .then((b) => b.pausedExecutions ?? [])\n}\n\n/** Resumes one pause point with the approver's submission, keyed by field name. */\nexport function resumeExecution(\n client: AginiesClient,\n workflowId: string,\n executionId: string,\n contextId: string,\n submission: Record<string, unknown> | null\n): Promise<ResumeOutcome> {\n return client\n .fetchRaw(path(workflowId, executionId, contextId), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(submission ? { input: { submission } } : {}),\n })\n .then((r) => readJson<ResumeOutcome>(r))\n}\n\n/* ───────────────────────────── form helpers ───────────────────────────── */\n\n/** Reads the approver's form out of a pause point, tolerating partial definitions. */\nexport function fieldsOf(point: PausePoint | null | undefined): ResumeField[] {\n const raw = point?.response?.data?.inputFormat\n if (!Array.isArray(raw)) return []\n return raw\n .map((f, index): ResumeField | null => {\n if (!f || typeof f !== 'object') return null\n const field = f as Record<string, unknown>\n const name = typeof field.name === 'string' ? field.name.trim() : ''\n if (!name) return null\n const str = (v: unknown) => (typeof v === 'string' && v.trim() ? v.trim() : undefined)\n return {\n id: str(field.id) ?? `field_${index}`,\n name,\n label: str(field.label) ?? name,\n type: str(field.type) ?? 'string',\n description: str(field.description),\n placeholder: str(field.placeholder),\n value: field.value,\n required: field.required === true,\n options: Array.isArray(field.options) ? field.options : undefined,\n rows: typeof field.rows === 'number' ? field.rows : undefined,\n }\n })\n .filter((f): f is ResumeField => f !== null)\n}\n\n/** The paused output shown to the approver: everything in `data` except form plumbing. */\nexport function outputOf(point: PausePoint | null | undefined): Record<string, unknown> {\n const data = point?.response?.data\n if (!data || typeof data !== 'object') return {}\n const { inputFormat: _f, resumeLinks: _l, ...rest } = data as Record<string, unknown>\n return rest\n}\n\n/** Formats a stored value for an input of this field's type. */\nexport function formatFieldValue(field: ResumeField, value: unknown): string {\n if (value === undefined || value === null) return ''\n switch (field.type) {\n case 'boolean':\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'string' && ['true', 'false'].includes(value.trim().toLowerCase()))\n return value.trim().toLowerCase()\n return ''\n case 'number':\n return typeof value === 'number'\n ? Number.isFinite(value)\n ? String(value)\n : ''\n : String(value)\n case 'array':\n case 'object':\n case 'files':\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return ''\n }\n default:\n return typeof value === 'string' ? value : JSON.stringify(value)\n }\n}\n\n/** Parses an input's text back into the field's type; `error` names what went wrong. */\nexport function parseFieldValue(\n field: ResumeField,\n raw: string\n): { value?: unknown; error?: 'number' | 'json' } {\n const text = raw.trim()\n switch (field.type) {\n case 'boolean':\n return { value: text === 'true' }\n case 'number': {\n const n = Number(text)\n return Number.isFinite(n) ? { value: n } : { error: 'number' }\n }\n case 'array':\n case 'object':\n case 'files':\n try {\n return { value: JSON.parse(text) }\n } catch {\n return { error: 'json' }\n }\n default:\n return { value: raw }\n }\n}\n\n/** Initial input text per field, from the block's defaults. */\nexport function initialValues(fields: ResumeField[]): Record<string, string> {\n return Object.fromEntries(fields.map((f) => [f.name, formatFieldValue(f, f.value)]))\n}\n\n/**\n * Builds the submission from the inputs, or reports the fields that are missing or\n * malformed. Empty optional fields are left out of the submission.\n */\nexport function buildSubmission(\n fields: ResumeField[],\n values: Record<string, string>\n): { submission: Record<string, unknown>; errors: Record<string, 'required' | 'number' | 'json'> } {\n const submission: Record<string, unknown> = {}\n const errors: Record<string, 'required' | 'number' | 'json'> = {}\n for (const field of fields) {\n const raw = values[field.name] ?? ''\n const present = field.type === 'boolean' ? raw === 'true' || raw === 'false' : raw.trim() !== ''\n if (!present) {\n if (field.required) errors[field.name] = 'required'\n continue\n }\n const { value, error } = parseFieldValue(field, raw)\n if (error) errors[field.name] = error\n else if (value !== undefined) submission[field.name] = value\n }\n return { submission, errors }\n}\n","import { type FormEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AginiesError } from '../client'\nimport { Button, cx, Eyebrow, Field, Input, Panel, Spinner, Tag, Textarea } from '../core'\nimport { useAginies, useModule } from '../provider'\nimport {\n buildSubmission,\n fieldsOf,\n getPausedExecution,\n initialValues,\n outputOf,\n type PausedExecution,\n type PausePoint,\n type ResumeField,\n type ResumeOutcome,\n resumeExecution,\n} from './approval-client'\n\nexport type ApprovalStatus =\n | 'loading'\n | 'ready'\n | 'submitting'\n | 'resumed'\n | 'queued'\n | 'not-found'\n | 'error'\n\n/**\n * State for one paused run: which pause point is selected, the approver's form, the\n * outcome of resuming. `ApprovalPanel` renders it; use the hook for a custom UI.\n */\nexport function useApproval(workflowId: string, executionId: string, contextId?: string) {\n const { client, t } = useAginies()\n const [status, setStatus] = useState<ApprovalStatus>('loading')\n const [execution, setExecution] = useState<PausedExecution | null>(null)\n const [selected, setSelected] = useState<string | null>(contextId ?? null)\n const [values, setValues] = useState<Record<string, string>>({})\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [error, setError] = useState<string | null>(null)\n const [outcome, setOutcome] = useState<ResumeOutcome | null>(null)\n const selectedRef = useRef<string | null>(contextId ?? null)\n\n const pausePoint: PausePoint | null = useMemo(() => {\n if (!execution) return null\n return (\n execution.pausePoints.find((p) => p.contextId === selected) ??\n execution.pausePoints.find((p) => p.resumeStatus === 'paused') ??\n execution.pausePoints[0] ??\n null\n )\n }, [execution, selected])\n\n const fields: ResumeField[] = useMemo(() => fieldsOf(pausePoint), [pausePoint])\n\n const load = useCallback(async () => {\n setStatus('loading')\n setError(null)\n try {\n const detail = await getPausedExecution(client, workflowId, executionId)\n setExecution(detail)\n const wanted = contextId ?? selectedRef.current\n const point =\n detail.pausePoints.find((p) => p.contextId === wanted) ??\n detail.pausePoints.find((p) => p.resumeStatus === 'paused') ??\n detail.pausePoints[0]\n if (point) {\n selectedRef.current = point.contextId\n setSelected(point.contextId)\n setValues(initialValues(fieldsOf(point)))\n }\n setErrors({})\n setStatus('ready')\n } catch (err) {\n if (err instanceof AginiesError && err.code === 'NOT_FOUND') setStatus('not-found')\n else {\n setError(err instanceof Error ? err.message : t('approval', 'loadError'))\n setStatus('error')\n }\n }\n }, [client, workflowId, executionId, contextId, t])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const select = useCallback(\n (nextContextId: string) => {\n selectedRef.current = nextContextId\n setSelected(nextContextId)\n const point = execution?.pausePoints.find((p) => p.contextId === nextContextId)\n setValues(initialValues(fieldsOf(point)))\n setErrors({})\n },\n [execution]\n )\n\n const setValue = useCallback((name: string, value: string) => {\n setValues((v) => ({ ...v, [name]: value }))\n setErrors((e) => {\n if (!(name in e)) return e\n const { [name]: _drop, ...rest } = e\n return rest\n })\n }, [])\n\n const submit = useCallback(async () => {\n if (!pausePoint || status === 'submitting') return\n const { submission, errors: problems } = buildSubmission(fields, values)\n if (Object.keys(problems).length > 0) {\n setErrors(\n Object.fromEntries(\n Object.entries(problems).map(([k, v]) => [\n k,\n v === 'required'\n ? t('approval', 'required')\n : v === 'number'\n ? t('approval', 'notANumber')\n : t('approval', 'notJson'),\n ])\n )\n )\n return\n }\n setStatus('submitting')\n setError(null)\n try {\n const result = await resumeExecution(\n client,\n workflowId,\n executionId,\n pausePoint.contextId,\n fields.length > 0 ? submission : null\n )\n setOutcome(result)\n setStatus(result.status === 'queued' ? 'queued' : 'resumed')\n } catch (err) {\n setError(err instanceof Error ? err.message : t('approval', 'resumeError'))\n setStatus('ready')\n }\n }, [client, workflowId, executionId, pausePoint, fields, values, status, t])\n\n return {\n status,\n execution,\n pausePoint,\n fields,\n values,\n errors,\n error,\n outcome,\n select,\n setValue,\n submit,\n reload: load,\n }\n}\n\n/* ───────────────────────────── component ───────────────────────────── */\n\nexport interface ApprovalPanelProps {\n /** Id of the agent (workflow) whose run is paused. */\n workflowId: string\n /** The paused execution, from the resume link the approver received. */\n executionId: string\n /** A specific pause point; defaults to the first one still paused. */\n contextId?: string\n title?: string\n description?: string\n /** Label of the resume button; defaults to \"Approve and continue\". */\n submitLabel?: string\n /** Called after the platform accepted the resume. */\n onResumed?: (outcome: ResumeOutcome) => void\n /** Hide the paused output block. */\n hideOutput?: boolean\n className?: string\n}\n\nconst STATUS_TONE: Record<string, 'default' | 'ok' | 'warn' | 'bad' | 'signal'> = {\n paused: 'warn',\n queued: 'signal',\n resuming: 'signal',\n resumed: 'ok',\n failed: 'bad',\n}\n\nexport function ApprovalPanel({\n workflowId,\n executionId,\n contextId,\n title,\n description,\n submitLabel,\n onResumed,\n hideOutput = false,\n className,\n}: ApprovalPanelProps) {\n const { t, locale } = useAginies()\n const enabled = useModule('approval')\n const a = useApproval(workflowId, executionId, contextId)\n const onResumedRef = useRef(onResumed)\n onResumedRef.current = onResumed\n\n useEffect(() => {\n if ((a.status === 'resumed' || a.status === 'queued') && a.outcome) {\n onResumedRef.current?.(a.outcome)\n }\n }, [a.status, a.outcome])\n\n if (!enabled) return null\n\n const point = a.pausePoint\n const output = hideOutput ? {} : outputOf(point)\n const outputEntries = Object.entries(output)\n const canSubmit = point?.resumeStatus === 'paused' && a.status === 'ready'\n const fmt = (iso: string | null | undefined) =>\n iso ? new Date(iso).toLocaleString(locale === 'tr' ? 'tr-TR' : 'en-GB') : ''\n\n const onSubmit = (e: FormEvent) => {\n e.preventDefault()\n void a.submit()\n }\n\n return (\n <Panel className={cx('agi-approval', className)} aria-busy={a.status === 'loading'}>\n <header className='agi-approval__head'>\n <Eyebrow>{t('approval', 'eyebrow')}</Eyebrow>\n <h3 className='agi-approval__title'>{title ?? t('approval', 'title')}</h3>\n {description && <p className='agi-approval__desc'>{description}</p>}\n {a.execution && (\n <p className='agi-approval__meta'>\n {t('approval', 'execution')}{' '}\n <span className='agi-approval__meta-value'>{a.execution.executionId.slice(0, 8)}</span>\n {a.execution.pausedAt && (\n <>\n {' · '}\n {t('approval', 'pausedAt')} {fmt(a.execution.pausedAt)}\n </>\n )}\n </p>\n )}\n </header>\n\n {a.status === 'loading' && (\n <div className='agi-approval__state'>\n <Spinner label={t('common', 'loading')} /> {t('common', 'loading')}\n </div>\n )}\n\n {a.status === 'not-found' && (\n <div className='agi-approval__state'>\n <p>{t('approval', 'notFound')}</p>\n </div>\n )}\n\n {a.status === 'error' && (\n <div className='agi-approval__state'>\n <p className='agi-approval__error'>{a.error}</p>\n <Button variant='outline' size='sm' onClick={() => void a.reload()}>\n {t('common', 'retry')}\n </Button>\n </div>\n )}\n\n {a.execution && a.execution.pausePoints.length > 1 && (\n <nav className='agi-approval__points' aria-label={t('approval', 'points')}>\n {a.execution.pausePoints.map((p, i) => (\n <button\n type='button'\n key={p.contextId}\n className={cx(\n 'agi-approval__point',\n p.contextId === point?.contextId && 'is-selected'\n )}\n onClick={() => a.select(p.contextId)}\n >\n <span>\n {t('approval', 'point')} {i + 1}\n </span>\n <Tag tone={STATUS_TONE[p.resumeStatus] ?? 'default'}>\n {t('approval', p.resumeStatus)}\n </Tag>\n </button>\n ))}\n </nav>\n )}\n\n {point && a.status !== 'loading' && (\n <>\n <div className='agi-approval__status'>\n <Tag tone={STATUS_TONE[point.resumeStatus] ?? 'default'}>\n {t('approval', point.resumeStatus)}\n </Tag>\n {typeof point.queuePosition === 'number' && point.queuePosition > 0 && (\n <span className='agi-approval__queue'>\n {t('approval', 'queuePosition')} {point.queuePosition}\n </span>\n )}\n </div>\n\n {outputEntries.length > 0 && (\n <section className='agi-approval__output' aria-label={t('approval', 'output')}>\n <div className='agi-approval__output-label'>{t('approval', 'output')}</div>\n <dl className='agi-approval__kv'>\n {outputEntries.map(([k, v]) => (\n <div key={k} className='agi-approval__kv-row'>\n <dt>{k}</dt>\n <dd>{typeof v === 'string' ? v : JSON.stringify(v, null, 2)}</dd>\n </div>\n ))}\n </dl>\n </section>\n )}\n\n {(a.status === 'resumed' || a.status === 'queued') && a.outcome ? (\n <output className='agi-approval__done'>\n <Tag tone={a.status === 'queued' ? 'signal' : 'ok'}>\n {t('approval', a.status === 'queued' ? 'queued' : 'resumed')}\n </Tag>\n <p>\n {a.status === 'queued'\n ? t('approval', 'queuedMessage')\n : t('approval', 'resumedMessage')}\n </p>\n </output>\n ) : (\n <form className='agi-approval__form' onSubmit={onSubmit}>\n {a.fields.map((f) => (\n <Field key={f.id} label={f.label} hint={f.description} error={a.errors[f.name]}>\n {renderField(f, a.values[f.name] ?? '', (v) => a.setValue(f.name, v), !canSubmit)}\n </Field>\n ))}\n {a.error && <p className='agi-approval__error'>{a.error}</p>}\n <div className='agi-approval__actions'>\n <Button variant='signal' type='submit' disabled={!canSubmit}>\n {a.status === 'submitting' ? (\n <>\n <Spinner label={t('approval', 'submitting')} /> {t('approval', 'submitting')}\n </>\n ) : (\n (submitLabel ?? t('approval', 'submit'))\n )}\n </Button>\n <Button\n variant='outline'\n type='button'\n onClick={() => void a.reload()}\n disabled={a.status === 'submitting'}\n >\n {t('approval', 'refresh')}\n </Button>\n </div>\n </form>\n )}\n </>\n )}\n </Panel>\n )\n}\n\nfunction renderField(f: ResumeField, value: string, set: (v: string) => void, disabled: boolean) {\n switch (f.type) {\n case 'boolean':\n return (\n <select\n className='agi-input'\n value={value}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n >\n <option value=''>—</option>\n <option value='true'>true</option>\n <option value='false'>false</option>\n </select>\n )\n case 'number':\n return (\n <Input\n type='number'\n value={value}\n placeholder={f.placeholder}\n required={f.required}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n />\n )\n case 'array':\n case 'object':\n case 'files':\n return (\n <Textarea\n value={value}\n rows={f.rows ?? 4}\n placeholder={f.placeholder ?? '{ }'}\n required={f.required}\n disabled={disabled}\n className='agi-approval__json'\n onChange={(e) => set(e.target.value)}\n />\n )\n default:\n if (Array.isArray(f.options) && f.options.length > 0) {\n return (\n <select\n className='agi-input'\n value={value}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n >\n <option value=''>—</option>\n {f.options.map((o) => {\n const opt =\n typeof o === 'object' && o !== null\n ? (o as { value?: unknown; label?: unknown })\n : { value: o, label: o }\n const v = String(opt.value ?? '')\n return (\n <option key={v} value={v}>\n {String(opt.label ?? v)}\n </option>\n )\n })}\n </select>\n )\n }\n if ((f.rows ?? 1) > 1) {\n return (\n <Textarea\n value={value}\n rows={f.rows}\n placeholder={f.placeholder}\n required={f.required}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n />\n )\n }\n return (\n <Input\n value={value}\n placeholder={f.placeholder}\n required={f.required}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n />\n )\n }\n}\n","import type {\n ButtonHTMLAttributes,\n HTMLAttributes,\n InputHTMLAttributes,\n TextareaHTMLAttributes,\n} from 'react'\nimport { forwardRef } from 'react'\n\n/** Joins class names, dropping falsy entries. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ')\n}\n\n/* ───────────────────────────── Button ───────────────────────────── */\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** `primary` is the text fill, `signal` the accent fill, `outline` the quiet default. */\n variant?: 'primary' | 'signal' | 'outline' | 'ghost' | 'destructive'\n size?: 'sm' | 'md' | 'lg'\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { variant = 'outline', size = 'md', className, type = 'button', ...props },\n ref\n) {\n return (\n <button\n ref={ref}\n type={type}\n className={cx('agi-btn', `agi-btn--${variant}`, `agi-btn--${size}`, className)}\n {...props}\n />\n )\n})\n\n/* ───────────────────────────── Tag / Chip ───────────────────────────── */\n\nexport interface TagProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: 'default' | 'signal' | 'ok' | 'warn' | 'bad'\n}\n\nexport function Tag({ tone = 'default', className, ...props }: TagProps) {\n return (\n <span\n className={cx('agi-tag', tone !== 'default' && `agi-tag--${tone}`, className)}\n {...props}\n />\n )\n}\n\nexport interface ChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n pressed?: boolean\n}\n\nexport function Chip({ pressed = false, className, type = 'button', ...props }: ChipProps) {\n return (\n <button type={type} aria-pressed={pressed} className={cx('agi-chip', className)} {...props} />\n )\n}\n\n/* ───────────────────────────── Surfaces ───────────────────────────── */\n\nexport interface PanelProps extends HTMLAttributes<HTMLDivElement> {\n level?: 1 | 2\n}\n\nexport function Panel({ level = 1, className, ...props }: PanelProps) {\n return <div className={cx('agi-panel', level === 2 && 'agi-panel--2', className)} {...props} />\n}\n\n/* ───────────────────────────── Type ───────────────────────────── */\n\nexport function Eyebrow({\n className,\n quiet,\n ...props\n}: HTMLAttributes<HTMLParagraphElement> & { quiet?: boolean }) {\n return <p className={cx('agi-eyebrow', quiet && 'agi-eyebrow--quiet', className)} {...props} />\n}\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n value: string\n label: string\n}\n\nexport function Stat({ value, label, className, ...props }: StatProps) {\n return (\n <div className={cx('agi-stat', className)} {...props}>\n <div className='agi-stat__v'>{value}</div>\n <div className='agi-stat__k'>{label}</div>\n </div>\n )\n}\n\n/* ───────────────────────────── Fields ───────────────────────────── */\n\nexport interface FieldProps extends HTMLAttributes<HTMLLabelElement> {\n label: string\n htmlFor?: string\n /** Help text under the control; replaced by `error` when one is set. */\n hint?: string\n error?: string\n}\n\nexport function Field({ label, hint, error, className, children, ...props }: FieldProps) {\n return (\n // biome-ignore lint/a11y/noLabelWithoutControl: the control is passed as children\n <label className={cx('agi-field', className)} {...props}>\n <span className='agi-field__label'>{label}</span>\n {children}\n {error ? (\n <span className='agi-field__error'>{error}</span>\n ) : (\n hint && <span className='agi-field__hint'>{hint}</span>\n )}\n </label>\n )\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(\n function Input({ className, ...props }, ref) {\n return <input ref={ref} className={cx('agi-input', className)} {...props} />\n }\n)\n\nexport const Textarea = forwardRef<\n HTMLTextAreaElement,\n TextareaHTMLAttributes<HTMLTextAreaElement>\n>(function Textarea({ className, ...props }, ref) {\n return <textarea ref={ref} className={cx('agi-input', 'agi-textarea', className)} {...props} />\n})\n\n/* ───────────────────────────── Feedback ───────────────────────────── */\n\nexport function Spinner({ className, label }: { className?: string; label?: string }) {\n return (\n <output className={cx('agi-spinner', className)} aria-label={label}>\n <span />\n <span />\n <span />\n </output>\n )\n}\n","import { createContext, type ReactNode, useContext, useEffect, useMemo, useState } from 'react'\nimport { type ActivationState, AginiesClient, type AginiesConfig } from './client'\nimport { type Locale, type Translator, translator } from './i18n'\n\nlet defaultClient: AginiesClient | null = null\n\n/**\n * Creates the shared client and starts the activation handshake. Call it once, before\n * rendering any widget; `AginiesProvider` picks the client up automatically.\n */\nexport function init(config: AginiesConfig): AginiesClient {\n defaultClient = new AginiesClient(config)\n void defaultClient.activate()\n return defaultClient\n}\n\n/** The client created by `init()`, if any. */\nexport function getClient(): AginiesClient | null {\n return defaultClient\n}\n\nexport interface AginiesContextValue {\n client: AginiesClient\n state: ActivationState\n locale: Locale\n t: Translator\n}\n\nconst AginiesContext = createContext<AginiesContextValue | null>(null)\n\n/**\n * Whether the activation unlocks `module` (`chat`, `run`, `observability`, `approval`).\n * A widget whose module is locked renders nothing and warns once.\n */\nexport function useModule(module: string): boolean {\n const { client } = useAginies()\n const allowed = client.hasModule(module)\n useEffect(() => {\n if (!allowed && typeof console !== 'undefined') {\n console.warn(`[aginies] the \"${module}\" module is not enabled for this activation key`)\n }\n }, [allowed, module])\n return allowed\n}\n\nexport interface AginiesProviderProps {\n /** A client from `init()` or `new AginiesClient()`. Defaults to the one `init()` made. */\n client?: AginiesClient\n /** Override the client's locale for this subtree. */\n locale?: Locale\n /** Rendered while the activation handshake runs. Defaults to nothing. */\n fallback?: ReactNode\n children: ReactNode\n}\n\n/**\n * Provides the activated client to every widget below it. Children render only once the\n * activation succeeds; a rejected activation renders nothing and logs one warning, so a\n * page with a wrong or missing token degrades to plain content.\n */\nexport function AginiesProvider({\n client,\n locale,\n fallback = null,\n children,\n}: AginiesProviderProps) {\n const resolved = client ?? defaultClient\n const [state, setState] = useState<ActivationState>(\n resolved?.getState() ?? { status: 'rejected', reason: 'init() was not called' }\n )\n\n useEffect(() => {\n if (!resolved) return\n setState(resolved.getState())\n const unsubscribe = resolved.subscribe(setState)\n void resolved.activate()\n return unsubscribe\n }, [resolved])\n\n useEffect(() => {\n if (state.status === 'rejected' && typeof console !== 'undefined') {\n console.warn(`[aginies] UI kit not activated: ${state.reason}`)\n }\n }, [state])\n\n const value = useMemo<AginiesContextValue | null>(() => {\n if (!resolved) return null\n const l = locale ?? resolved.locale\n return { client: resolved, state, locale: l, t: translator(l) }\n }, [resolved, state, locale])\n\n if (!value) return null\n if (state.status === 'idle' || state.status === 'activating') return <>{fallback}</>\n if (state.status === 'rejected') return null\n return <AginiesContext.Provider value={value}>{children}</AginiesContext.Provider>\n}\n\n/** Access to the activated client, its configuration and the translator. */\nexport function useAginies(): AginiesContextValue {\n const ctx = useContext(AginiesContext)\n if (!ctx) {\n throw new Error('[aginies] useAginies must be used inside <AginiesProvider> after init()')\n }\n return ctx\n}\n","export type Locale = 'tr' | 'en'\n\nconst STRINGS = {\n chat: {\n open: { tr: 'Sohbeti aç', en: 'Open chat' },\n close: { tr: 'Kapat', en: 'Close' },\n placeholder: { tr: 'Mesajınızı yazın…', en: 'Type your message…' },\n send: { tr: 'Gönder', en: 'Send' },\n stop: { tr: 'Durdur', en: 'Stop' },\n attach: { tr: 'Dosya ekle', en: 'Attach file' },\n attachments: { tr: 'Ekler', en: 'Attachments' },\n removeFile: { tr: 'Dosyayı kaldır', en: 'Remove file' },\n tooManyFiles: { tr: 'En fazla 5 dosya ekleyebilirsiniz.', en: 'You can attach up to 5 files.' },\n fileTooLarge: {\n tr: \"Dosyalar 10 MB'tan küçük olmalı.\",\n en: 'Files must be smaller than 10 MB.',\n },\n welcome: {\n tr: 'Merhaba! Size nasıl yardımcı olabilirim?',\n en: 'Hi there! How can I help you today?',\n },\n thinking: { tr: 'Yanıt hazırlanıyor', en: 'Working on it' },\n stopped: { tr: 'Yanıt durduruldu.', en: 'Response stopped.' },\n error: {\n tr: 'Bir sorun oluştu. Lütfen tekrar deneyin.',\n en: 'Something went wrong. Please try again.',\n },\n unavailable: {\n tr: 'Bu sohbet şu anda kullanılamıyor.',\n en: 'This chat is currently unavailable.',\n },\n poweredBy: { tr: 'Aginies ile', en: 'Powered by Aginies' },\n you: { tr: 'Siz', en: 'You' },\n assistant: { tr: 'Ajan', en: 'Agent' },\n },\n auth: {\n passwordTitle: { tr: 'Bu sohbet parola korumalı', en: 'This chat is password protected' },\n passwordHint: { tr: 'Devam etmek için parolayı girin.', en: 'Enter the password to continue.' },\n password: { tr: 'Parola', en: 'Password' },\n emailTitle: { tr: 'E-posta ile doğrulama', en: 'Verify with your e-mail' },\n emailHint: {\n tr: 'İş e-postanızı girin; size bir kod göndereceğiz.',\n en: 'Enter your work e-mail; we will send you a code.',\n },\n email: { tr: 'E-posta', en: 'E-mail' },\n code: { tr: 'Doğrulama kodu', en: 'Verification code' },\n codeHint: {\n tr: 'E-postanıza gelen 6 haneli kodu girin.',\n en: 'Enter the 6-digit code from your e-mail.',\n },\n continue: { tr: 'Devam et', en: 'Continue' },\n sendCode: { tr: 'Kod gönder', en: 'Send code' },\n verify: { tr: 'Doğrula', en: 'Verify' },\n back: { tr: 'Geri', en: 'Back' },\n invalidPassword: { tr: 'Parola yanlış.', en: 'Wrong password.' },\n invalidEmail: {\n tr: 'Bu e-posta adresi yetkili değil.',\n en: 'This e-mail address is not allowed.',\n },\n invalidCode: {\n tr: 'Kod geçersiz veya süresi dolmuş.',\n en: 'The code is invalid or has expired.',\n },\n codeSent: { tr: 'Kod gönderildi.', en: 'Code sent.' },\n codeError: {\n tr: 'Kod gönderilemedi. Lütfen tekrar deneyin.',\n en: 'The code could not be sent. Please try again.',\n },\n resend: { tr: 'Kodu yeniden gönder', en: 'Resend code' },\n ssoTitle: { tr: 'Kurumsal giriş gerekli', en: 'Sign in with your organisation' },\n ssoHint: {\n tr: 'Bu sohbet kurumsal kimlikle açılır.',\n en: 'This chat opens with your organisation account.',\n },\n ssoButton: { tr: 'Kurumsal giriş', en: 'Sign in' },\n },\n run: {\n submit: { tr: 'Çalıştır', en: 'Run' },\n cancel: { tr: 'İptal', en: 'Cancel' },\n running: { tr: 'Çalışıyor', en: 'Running' },\n done: { tr: 'Tamamlandı', en: 'Completed' },\n error: { tr: 'Hata', en: 'Error' },\n failed: { tr: 'Çalıştırma başarısız oldu.', en: 'The run failed.' },\n unauthorized: { tr: 'API anahtarı reddedildi.', en: 'The API key was rejected.' },\n steps: { tr: 'Adımlar', en: 'Steps' },\n execution: { tr: 'çalıştırma', en: 'execution' },\n },\n approval: {\n eyebrow: { tr: 'İnsan onayı', en: 'Human approval' },\n title: { tr: 'Onay bekleyen adım', en: 'A step is waiting for approval' },\n execution: { tr: 'çalıştırma', en: 'execution' },\n pausedAt: { tr: 'duraklatıldı', en: 'paused' },\n points: { tr: 'Onay noktaları', en: 'Approval points' },\n point: { tr: 'Nokta', en: 'Point' },\n output: { tr: 'Ajanın önerisi', en: 'What the agent proposes' },\n queuePosition: { tr: 'Sıra', en: 'Queue position' },\n submit: { tr: 'Onayla ve devam et', en: 'Approve and continue' },\n submitting: { tr: 'Gönderiliyor', en: 'Submitting' },\n refresh: { tr: 'Yenile', en: 'Refresh' },\n required: { tr: 'Bu alan zorunlu.', en: 'This field is required.' },\n notANumber: { tr: 'Sayı girin.', en: 'Enter a number.' },\n notJson: { tr: 'Geçerli JSON girin.', en: 'Enter valid JSON.' },\n notFound: {\n tr: 'Bu onay bulunamadı; süresi dolmuş veya tamamlanmış olabilir.',\n en: 'This approval could not be found; it may have expired or been completed.',\n },\n loadError: { tr: 'Onay yüklenemedi.', en: 'The approval could not be loaded.' },\n resumeError: { tr: 'Devam ettirilemedi.', en: 'The run could not be resumed.' },\n resumedMessage: {\n tr: 'Ajan kaldığı yerden devam ediyor.',\n en: 'The agent is continuing from where it paused.',\n },\n queuedMessage: {\n tr: 'Onay sıraya alındı; önceki devam işlemleri bitince çalışacak.',\n en: 'The approval is queued; it runs after the earlier resumes finish.',\n },\n paused: { tr: 'Onay bekliyor', en: 'Awaiting approval' },\n queued: { tr: 'Sırada', en: 'Queued' },\n resuming: { tr: 'Devam ediyor', en: 'Resuming' },\n resumed: { tr: 'Devam etti', en: 'Resumed' },\n failed: { tr: 'Başarısız', en: 'Failed' },\n },\n common: {\n loading: { tr: 'Yükleniyor', en: 'Loading' },\n retry: { tr: 'Tekrar dene', en: 'Retry' },\n notActivated: {\n tr: 'Aginies UI paketi etkinleştirilmedi.',\n en: 'The Aginies UI package is not activated.',\n },\n },\n} as const\n\ntype Section = keyof typeof STRINGS\ntype Key<S extends Section> = keyof (typeof STRINGS)[S]\n\n/** Returns a translator bound to a locale: `t('chat', 'send')`. */\nexport function translator(locale: Locale) {\n return function t<S extends Section>(section: S, key: Key<S>): string {\n const entry = STRINGS[section][key] as { tr: string; en: string }\n return entry[locale] ?? entry.en\n }\n}\n\nexport type Translator = ReturnType<typeof translator>\n","import { type ChangeEvent, type FormEvent, useCallback, useEffect, useRef, useState } from 'react'\nimport { AginiesError, type ChatConfig, type ChatFilePayload } from '../client'\nimport { Button, cx, Field, Input, Spinner } from '../core'\nimport { useAginies, useModule } from '../provider'\nimport { Markdown } from './markdown'\nimport { parseStructured, type StructuredResponse, StructuredUI } from './structured-ui'\n\n/** A file the visitor attached to a message, as shown in the transcript. */\nexport interface ChatAttachment {\n name: string\n type: string\n size: number\n}\n\nexport interface ChatMessage {\n id: string\n role: 'user' | 'assistant'\n content: string\n attachments?: ChatAttachment[]\n structured?: StructuredResponse | null\n streaming?: boolean\n error?: boolean\n}\n\n/** Outcome of asking the platform to e-mail a verification code. */\nexport type CodeRequestResult = 'sent' | 'unauthorized' | 'error'\n\n/** Per-file and per-message limits for attachments; the platform rejects larger uploads. */\nexport const ATTACHMENT_LIMITS = { maxFiles: 5, maxBytes: 10 * 1024 * 1024 } as const\n\ntype AuthNeed = 'password' | 'email' | 'sso' | null\n\n/**\n * Chat state for one hosted-chat deployment: configuration, authentication, messages and\n * the streaming turn in flight. `ChatWidget` renders it; use the hook directly for a custom UI.\n */\nexport function useChat(identifier: string, enabled = true) {\n const { client, t } = useAginies()\n const [config, setConfig] = useState<ChatConfig | null>(null)\n const [authNeed, setAuthNeed] = useState<AuthNeed>(null)\n const [authTitle, setAuthTitle] = useState<string | undefined>()\n const [loadError, setLoadError] = useState<string | null>(null)\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [busy, setBusy] = useState(false)\n const [conversationId] = useState(() => randomId())\n const abortRef = useRef<AbortController | null>(null)\n\n const load = useCallback(async () => {\n setLoadError(null)\n try {\n const res = await client.getChat(identifier)\n if ('authRequired' in res) {\n setAuthNeed(res.authRequired === 'public' ? null : res.authRequired)\n setAuthTitle(res.title)\n return\n }\n setConfig(res)\n setAuthNeed(null)\n } catch (err) {\n setLoadError(\n err instanceof AginiesError && err.status === 403\n ? t('chat', 'unavailable')\n : t('chat', 'error')\n )\n }\n }, [client, identifier, t])\n\n useEffect(() => {\n if (enabled) void load()\n }, [load, enabled])\n\n const chatPath = `/api/chat/${encodeURIComponent(identifier)}`\n\n /** Sends the password as a first turn; the platform sets its cookie and returns the config. */\n const authenticate = useCallback(\n async ({ password }: { password: string }) => {\n const res = await client.fetchRaw(chatPath, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ password, conversationId }),\n })\n if (res.ok) {\n await load()\n return true\n }\n return false\n },\n [client, chatPath, conversationId, load]\n )\n\n /** Asks the platform to e-mail a one-time code to an address on the chat's allow-list. */\n const requestCode = useCallback(\n async (email: string): Promise<CodeRequestResult> => {\n const res = await client.fetchRaw(`${chatPath}/otp`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email }),\n })\n if (res.ok) return 'sent'\n return res.status === 403 ? 'unauthorized' : 'error'\n },\n [client, chatPath]\n )\n\n /** Verifies the e-mailed code; on success the platform sets its cookie and the chat loads. */\n const verifyCode = useCallback(\n async (email: string, otp: string) => {\n const res = await client.fetchRaw(`${chatPath}/otp`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, otp }),\n })\n if (res.ok) {\n await load()\n return true\n }\n return false\n },\n [client, chatPath, load]\n )\n\n const stop = useCallback(() => {\n abortRef.current?.abort()\n abortRef.current = null\n setBusy(false)\n setMessages((prev) => {\n const last = prev[prev.length - 1]\n if (!last || last.role !== 'assistant' || !last.streaming) return prev\n return [\n ...prev.slice(0, -1),\n { ...last, streaming: false, content: last.content || t('chat', 'stopped') },\n ]\n })\n }, [t])\n\n const send = useCallback(\n async (text: string, files: ChatFilePayload[] = []) => {\n const input = text.trim()\n if ((!input && files.length === 0) || busy) return\n const userMessage: ChatMessage = {\n id: randomId(),\n role: 'user',\n content: input,\n attachments: files.map(({ name, type, size }) => ({ name, type, size })),\n }\n const assistantId = randomId()\n setMessages((prev) => [\n ...prev,\n userMessage,\n { id: assistantId, role: 'assistant', content: '', streaming: true },\n ])\n setBusy(true)\n const controller = new AbortController()\n abortRef.current = controller\n let content = ''\n const update = (patch: Partial<ChatMessage>) =>\n setMessages((prev) => prev.map((m) => (m.id === assistantId ? { ...m, ...patch } : m)))\n try {\n for await (const ev of client.sendMessage(\n identifier,\n { input, conversationId, files },\n controller.signal\n )) {\n if (ev.type === 'chunk') {\n content += ev.text\n update({ content })\n } else if (ev.type === 'final') {\n const text = extractFinalText(ev.data)\n if (text && !content) {\n content = text\n update({ content })\n }\n } else if (ev.type === 'error') {\n update({ content: ev.message, error: true, streaming: false })\n }\n }\n update({ streaming: false, structured: parseStructured(content) })\n } catch (err) {\n if (controller.signal.aborted) return\n const message =\n err instanceof AginiesError && err.code === 'AUTH_REQUIRED'\n ? t('chat', 'unavailable')\n : t('chat', 'error')\n update({ content: message, error: true, streaming: false })\n if (err instanceof AginiesError && err.code === 'AUTH_REQUIRED') void load()\n } finally {\n abortRef.current = null\n setBusy(false)\n }\n },\n [busy, client, identifier, conversationId, t, load]\n )\n\n return {\n config,\n authNeed,\n authTitle,\n loadError,\n messages,\n busy,\n send,\n stop,\n authenticate,\n requestCode,\n verifyCode,\n reload: load,\n }\n}\n\nfunction extractFinalText(data: unknown): string | null {\n if (!data || typeof data !== 'object') return null\n const d = data as { output?: Record<string, Record<string, unknown>> }\n if (!d.output) return null\n for (const block of Object.values(d.output)) {\n if (block && typeof block === 'object') {\n const b = block as Record<string, unknown>\n if (typeof b.content === 'string') return b.content\n if (typeof b.result === 'string') return b.result\n }\n }\n return null\n}\n\nfunction randomId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) return crypto.randomUUID()\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`\n}\n\n/* ───────────────────────────── widget ───────────────────────────── */\n\nexport interface ChatWidgetProps {\n /** Identifier of the deployed chat, the last segment of its hosted URL. */\n identifier: string\n /** `bubble` floats a launcher in a corner; `inline` fills its container; `full` fills the viewport. */\n mode?: 'bubble' | 'inline' | 'full'\n /** Corner for `bubble` mode. */\n position?: 'right' | 'left'\n /** Text on the launcher; defaults to the chat title. */\n launcherLabel?: string\n /** Start open (bubble mode). */\n defaultOpen?: boolean\n /** Theme for the widget subtree; `auto` follows the host page. */\n theme?: 'dark' | 'light' | 'auto'\n className?: string\n}\n\nexport function ChatWidget({\n identifier,\n mode = 'inline',\n position = 'right',\n launcherLabel,\n defaultOpen = false,\n theme = 'auto',\n className,\n}: ChatWidgetProps) {\n const [open, setOpen] = useState(defaultOpen || mode !== 'bubble')\n const { t } = useAginies()\n const enabled = useModule('chat')\n const chat = useChat(identifier, enabled)\n const title = chat.config?.title ?? chat.authTitle ?? launcherLabel ?? 'Aginies'\n const themeClass = theme === 'auto' ? undefined : theme === 'dark' ? 'dark' : 'light'\n if (!enabled) return null\n\n const panel = (\n <section\n className={cx('agi-chat', `agi-chat--${mode}`, themeClass, className)}\n data-theme={themeClass}\n aria-label={title}\n >\n <header className='agi-chat__head'>\n <div className='agi-chat__title'>\n {chat.config?.customizations.imageUrl && (\n <img src={chat.config.customizations.imageUrl} alt='' />\n )}\n <div>\n <div className='agi-chat__name'>{title}</div>\n {chat.config?.description && (\n <div className='agi-chat__desc'>{chat.config.description}</div>\n )}\n </div>\n </div>\n {mode === 'bubble' && (\n <button\n type='button'\n className='agi-chat__close'\n onClick={() => setOpen(false)}\n aria-label={t('chat', 'close')}\n >\n ×\n </button>\n )}\n </header>\n\n {chat.loadError ? (\n <div className='agi-chat__state'>\n <p>{chat.loadError}</p>\n <Button variant='outline' size='sm' onClick={() => void chat.reload()}>\n {t('common', 'retry')}\n </Button>\n </div>\n ) : chat.authNeed ? (\n <ChatAuth\n need={chat.authNeed}\n onPassword={chat.authenticate}\n onRequestCode={chat.requestCode}\n onVerifyCode={chat.verifyCode}\n />\n ) : !chat.config ? (\n <div className='agi-chat__state'>\n <Spinner label={t('common', 'loading')} />\n </div>\n ) : (\n <>\n <MessageList\n messages={chat.messages}\n welcome={chat.config.customizations.welcomeMessage || t('chat', 'welcome')}\n onAction={(action) => void chat.send(action)}\n />\n <Composer busy={chat.busy} onSend={chat.send} onStop={chat.stop} />\n </>\n )}\n <footer className='agi-chat__foot'>\n <a href='https://www.aginies.com' target='_blank' rel='noreferrer'>\n {t('chat', 'poweredBy')}\n </a>\n </footer>\n </section>\n )\n\n if (mode !== 'bubble') return panel\n\n return (\n <div\n className={cx('agi-bubble', `agi-bubble--${position}`, themeClass)}\n data-theme={themeClass}\n >\n {open && panel}\n <button\n type='button'\n className={cx('agi-bubble__launcher', open && 'agi-bubble__launcher--open')}\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n aria-label={open ? t('chat', 'close') : t('chat', 'open')}\n >\n <svg\n width='22'\n height='22'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='1.7'\n strokeLinecap='round'\n strokeLinejoin='round'\n aria-hidden='true'\n >\n <path d='M4 5.5A2.5 2.5 0 0 1 6.5 3h11A2.5 2.5 0 0 1 20 5.5v8a2.5 2.5 0 0 1-2.5 2.5H10l-5 4v-4H6.5A2.5 2.5 0 0 1 4 13.5v-8z' />\n <path d='M8 8h8M8 11.5h5' />\n </svg>\n {!open && <span>{launcherLabel ?? title}</span>}\n </button>\n </div>\n )\n}\n\n/* ───────────────────────────── parts ───────────────────────────── */\n\nfunction MessageList({\n messages,\n welcome,\n onAction,\n}: {\n messages: ChatMessage[]\n welcome: string\n onAction: (action: string) => void\n}) {\n const { t } = useAginies()\n const endRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n endRef.current?.scrollIntoView?.({ block: 'end' })\n }, [])\n return (\n // biome-ignore lint/a11y/useSemanticElements: no native element conveys a live log\n <div className='agi-chat__messages' role='log' aria-live='polite'>\n <div className='agi-msg agi-msg--assistant'>\n <span className='agi-msg__who'>{t('chat', 'assistant')}</span>\n <div className='agi-msg__body'>{welcome}</div>\n </div>\n {messages.map((m) => (\n <div\n key={m.id}\n className={cx('agi-msg', `agi-msg--${m.role}`, m.error && 'agi-msg--error')}\n >\n <span className='agi-msg__who'>\n {m.role === 'user' ? t('chat', 'you') : t('chat', 'assistant')}\n </span>\n <div className='agi-msg__body'>\n {m.structured ? (\n <StructuredUI response={m.structured} onAction={onAction} />\n ) : m.content ? (\n m.role === 'assistant' && !m.error ? (\n <Markdown className='agi-md' text={m.content} />\n ) : (\n <p>{m.content}</p>\n )\n ) : m.streaming ? (\n <span className='agi-msg__thinking'>\n <Spinner label={t('chat', 'thinking')} /> {t('chat', 'thinking')}\n </span>\n ) : null}\n {m.attachments && m.attachments.length > 0 && (\n <ul className='agi-msg__files' aria-label={t('chat', 'attachments')}>\n {m.attachments.map((file, n) => (\n <li key={n} className='agi-file'>\n <FileGlyph />\n <span className='agi-file__name'>{file.name}</span>\n <span className='agi-file__size'>{formatBytes(file.size)}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n ))}\n <div ref={endRef} />\n </div>\n )\n}\n\nfunction Composer({\n busy,\n onSend,\n onStop,\n}: {\n busy: boolean\n onSend: (text: string, files?: ChatFilePayload[]) => Promise<void>\n onStop: () => void\n}) {\n const { t } = useAginies()\n const [value, setValue] = useState('')\n const [files, setFiles] = useState<ChatFilePayload[]>([])\n const [fileError, setFileError] = useState<string | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n\n const submit = (e: FormEvent) => {\n e.preventDefault()\n if (busy) return\n const text = value\n const attached = files\n setValue('')\n setFiles([])\n setFileError(null)\n void onSend(text, attached)\n }\n\n const pick = async (e: ChangeEvent<HTMLInputElement>) => {\n const chosen = Array.from(e.target.files ?? [])\n e.target.value = ''\n if (chosen.length === 0) return\n if (files.length + chosen.length > ATTACHMENT_LIMITS.maxFiles) {\n setFileError(t('chat', 'tooManyFiles'))\n return\n }\n if (chosen.some((file) => file.size > ATTACHMENT_LIMITS.maxBytes)) {\n setFileError(t('chat', 'fileTooLarge'))\n return\n }\n setFileError(null)\n const payloads = await Promise.all(chosen.map(readFile))\n setFiles((prev) => [...prev, ...payloads])\n }\n\n const canSend = value.trim().length > 0 || files.length > 0\n\n return (\n <form className='agi-chat__composer' onSubmit={submit}>\n {(files.length > 0 || fileError) && (\n <div className='agi-chat__pending'>\n {files.map((file, n) => (\n <span key={n} className='agi-file agi-file--pending'>\n <FileGlyph />\n <span className='agi-file__name'>{file.name}</span>\n <button\n type='button'\n className='agi-file__remove'\n aria-label={`${t('chat', 'removeFile')}: ${file.name}`}\n onClick={() => setFiles((prev) => prev.filter((_, i) => i !== n))}\n >\n ×\n </button>\n </span>\n ))}\n {fileError && <span className='agi-chat__file-error'>{fileError}</span>}\n </div>\n )}\n <div className='agi-chat__row'>\n <input\n ref={fileInput}\n type='file'\n multiple\n hidden\n onChange={pick}\n data-testid='agi-file-input'\n />\n <Button\n variant='ghost'\n type='button'\n aria-label={t('chat', 'attach')}\n title={t('chat', 'attach')}\n disabled={busy}\n onClick={() => fileInput.current?.click()}\n >\n <svg width='16' height='16' viewBox='0 0 24 24' fill='none' aria-hidden='true'>\n <path\n d='M21 12.5 12.8 20.7a5.5 5.5 0 0 1-7.8-7.8l8.6-8.6a3.5 3.5 0 0 1 5 5l-8.6 8.6a1.5 1.5 0 0 1-2.1-2.1L15.5 8'\n stroke='currentColor'\n strokeWidth='1.6'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n </Button>\n <Input\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={t('chat', 'placeholder')}\n aria-label={t('chat', 'placeholder')}\n autoComplete='off'\n />\n {busy ? (\n <Button variant='outline' onClick={onStop}>\n {t('chat', 'stop')}\n </Button>\n ) : (\n <Button variant='signal' type='submit' disabled={!canSend}>\n {t('chat', 'send')}\n </Button>\n )}\n </div>\n </form>\n )\n}\n\nfunction readFile(file: File): Promise<ChatFilePayload> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () =>\n resolve({\n name: file.name,\n type: file.type || 'application/octet-stream',\n size: file.size,\n data: String(reader.result),\n lastModified: file.lastModified,\n })\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n}\n\nfunction formatBytes(size: number): string {\n if (size < 1024) return `${size} B`\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(0)} KB`\n return `${(size / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction FileGlyph() {\n return (\n <svg width='12' height='12' viewBox='0 0 24 24' fill='none' aria-hidden='true'>\n <path\n d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8l-5-5z'\n stroke='currentColor'\n strokeWidth='1.8'\n strokeLinejoin='round'\n />\n <path d='M14 3v5h5' stroke='currentColor' strokeWidth='1.8' strokeLinejoin='round' />\n </svg>\n )\n}\n\nfunction ChatAuth({\n need,\n onPassword,\n onRequestCode,\n onVerifyCode,\n}: {\n need: Exclude<AuthNeed, null>\n onPassword: (c: { password: string }) => Promise<boolean>\n onRequestCode: (email: string) => Promise<CodeRequestResult>\n onVerifyCode: (email: string, code: string) => Promise<boolean>\n}) {\n const { t, client } = useAginies()\n\n if (need === 'sso') {\n return (\n <div className='agi-chat__state'>\n <h3>{t('auth', 'ssoTitle')}</h3>\n <p>{t('auth', 'ssoHint')}</p>\n <Button\n variant='signal'\n onClick={() => window.open(`${client.baseUrl}/chat/`, '_blank', 'noopener')}\n >\n {t('auth', 'ssoButton')}\n </Button>\n </div>\n )\n }\n\n if (need === 'email') {\n return <EmailAuth onRequestCode={onRequestCode} onVerifyCode={onVerifyCode} />\n }\n\n return <PasswordAuth onPassword={onPassword} />\n}\n\nfunction PasswordAuth({\n onPassword,\n}: {\n onPassword: (c: { password: string }) => Promise<boolean>\n}) {\n const { t } = useAginies()\n const [value, setValue] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [pending, setPending] = useState(false)\n\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n setPending(true)\n setError(null)\n const ok = await onPassword({ password: value })\n setPending(false)\n if (!ok) setError(t('auth', 'invalidPassword'))\n }\n\n return (\n <form className='agi-chat__state agi-chat__auth' onSubmit={submit}>\n <h3>{t('auth', 'passwordTitle')}</h3>\n <p>{t('auth', 'passwordHint')}</p>\n <Field label={t('auth', 'password')} error={error ?? undefined}>\n <Input\n type='password'\n value={value}\n onChange={(e) => setValue(e.target.value)}\n required\n autoComplete='current-password'\n />\n </Field>\n <Button variant='signal' type='submit' disabled={pending || !value}>\n {t('auth', 'continue')}\n </Button>\n </form>\n )\n}\n\n/**\n * Two steps, mirroring the platform's hosted page: the address goes to the allow-list check\n * and receives a six-digit code; the code is then verified and the platform sets its cookie.\n */\nfunction EmailAuth({\n onRequestCode,\n onVerifyCode,\n}: {\n onRequestCode: (email: string) => Promise<CodeRequestResult>\n onVerifyCode: (email: string, code: string) => Promise<boolean>\n}) {\n const { t } = useAginies()\n const [email, setEmail] = useState('')\n const [code, setCode] = useState('')\n const [step, setStep] = useState<'email' | 'code'>('email')\n const [error, setError] = useState<string | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n const [pending, setPending] = useState(false)\n\n const request = async () => {\n setPending(true)\n setError(null)\n setNotice(null)\n const result = await onRequestCode(email.trim())\n setPending(false)\n if (result === 'sent') {\n setStep('code')\n setNotice(t('auth', 'codeSent'))\n } else {\n setError(t('auth', result === 'unauthorized' ? 'invalidEmail' : 'codeError'))\n }\n }\n\n const verify = async () => {\n setPending(true)\n setError(null)\n setNotice(null)\n const ok = await onVerifyCode(email.trim(), code.trim())\n setPending(false)\n if (!ok) setError(t('auth', 'invalidCode'))\n }\n\n const submit = (e: FormEvent) => {\n e.preventDefault()\n void (step === 'email' ? request() : verify())\n }\n\n if (step === 'code') {\n return (\n <form className='agi-chat__state agi-chat__auth' onSubmit={submit}>\n <h3>{t('auth', 'emailTitle')}</h3>\n <p>\n {t('auth', 'codeHint')} <strong>{email}</strong>\n </p>\n <Field label={t('auth', 'code')} error={error ?? undefined} hint={notice ?? undefined}>\n <Input\n inputMode='numeric'\n autoComplete='one-time-code'\n pattern='[0-9]{6}'\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n required\n />\n </Field>\n <div className='agi-chat__auth-actions'>\n <Button variant='signal' type='submit' disabled={pending || code.length !== 6}>\n {t('auth', 'verify')}\n </Button>\n <Button variant='ghost' type='button' disabled={pending} onClick={() => void request()}>\n {t('auth', 'resend')}\n </Button>\n <Button\n variant='ghost'\n type='button'\n disabled={pending}\n onClick={() => {\n setStep('email')\n setCode('')\n setError(null)\n setNotice(null)\n }}\n >\n {t('auth', 'back')}\n </Button>\n </div>\n </form>\n )\n }\n\n return (\n <form className='agi-chat__state agi-chat__auth' onSubmit={submit}>\n <h3>{t('auth', 'emailTitle')}</h3>\n <p>{t('auth', 'emailHint')}</p>\n <Field label={t('auth', 'email')} error={error ?? undefined}>\n <Input\n type='email'\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n autoComplete='email'\n />\n </Field>\n <Button variant='signal' type='submit' disabled={pending || !email.trim()}>\n {t('auth', 'sendCode')}\n </Button>\n </form>\n )\n}\n","import { Fragment, type ReactNode } from 'react'\n\n/**\n * Small Markdown renderer for agent replies. It builds React elements directly, so nothing\n * from the model reaches the DOM as HTML. Covers what agents actually write: paragraphs,\n * headings, emphasis, inline and fenced code, links, lists, blockquotes, tables and rules.\n */\nexport function Markdown({ text, className }: { text: string; className?: string }) {\n return <div className={className}>{renderBlocks(parseBlocks(text))}</div>\n}\n\n/* ───────────────────────────── blocks ───────────────────────────── */\n\ntype Block =\n | { kind: 'paragraph'; lines: string[] }\n | { kind: 'heading'; level: number; text: string }\n | { kind: 'code'; lang: string; code: string }\n | { kind: 'quote'; blocks: Block[] }\n | { kind: 'list'; ordered: boolean; start: number; items: string[] }\n | {\n kind: 'table'\n header: string[]\n align: Array<'left' | 'center' | 'right' | null>\n rows: string[][]\n }\n | { kind: 'rule' }\n\nconst FENCE = /^\\s*(`{3,}|~{3,})\\s*([\\w+-]*)\\s*$/\nconst HEADING = /^(#{1,6})\\s+(.*?)\\s*#*\\s*$/\nconst RULE = /^\\s*([-*_])(?:\\s*\\1){2,}\\s*$/\nconst QUOTE = /^\\s*>\\s?(.*)$/\nconst LIST = /^\\s*(?:([-*+])|(\\d{1,9})[.)])\\s+(.*)$/\nconst TABLE_SEPARATOR = /^\\s*\\|?\\s*:?-+:?\\s*(\\|\\s*:?-+:?\\s*)*\\|?\\s*$/\n\nexport function parseBlocks(text: string): Block[] {\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n')\n const blocks: Block[] = []\n let i = 0\n let paragraph: string[] = []\n\n const flush = () => {\n if (paragraph.length > 0) {\n blocks.push({ kind: 'paragraph', lines: paragraph })\n paragraph = []\n }\n }\n\n while (i < lines.length) {\n const line = lines[i] as string\n\n if (line.trim() === '') {\n flush()\n i += 1\n continue\n }\n\n const fence = FENCE.exec(line)\n if (fence) {\n flush()\n const marker = fence[1] as string\n const lang = fence[2] ?? ''\n const code: string[] = []\n i += 1\n while (i < lines.length && !(lines[i] as string).trim().startsWith(marker)) {\n code.push(lines[i] as string)\n i += 1\n }\n i += 1\n blocks.push({ kind: 'code', lang, code: code.join('\\n') })\n continue\n }\n\n const heading = HEADING.exec(line)\n if (heading) {\n flush()\n blocks.push({ kind: 'heading', level: (heading[1] as string).length, text: heading[2] ?? '' })\n i += 1\n continue\n }\n\n if (RULE.test(line)) {\n flush()\n blocks.push({ kind: 'rule' })\n i += 1\n continue\n }\n\n if (QUOTE.test(line)) {\n flush()\n const inner: string[] = []\n while (i < lines.length && QUOTE.test(lines[i] as string)) {\n inner.push((QUOTE.exec(lines[i] as string) as RegExpExecArray)[1] ?? '')\n i += 1\n }\n blocks.push({ kind: 'quote', blocks: parseBlocks(inner.join('\\n')) })\n continue\n }\n\n const list = LIST.exec(line)\n if (list) {\n flush()\n const ordered = list[2] !== undefined\n const start = ordered ? Number.parseInt(list[2] as string, 10) : 1\n const items: string[] = []\n while (i < lines.length) {\n const m = LIST.exec(lines[i] as string)\n if (m && (m[2] !== undefined) === ordered) {\n items.push(m[3] ?? '')\n i += 1\n } else if (\n items.length > 0 &&\n (lines[i] as string).trim() !== '' &&\n /^\\s{2,}/.test(lines[i] as string) &&\n !LIST.test(lines[i] as string)\n ) {\n // A continuation line indented under the previous item.\n items[items.length - 1] = `${items[items.length - 1]} ${(lines[i] as string).trim()}`\n i += 1\n } else {\n break\n }\n }\n blocks.push({ kind: 'list', ordered, start, items })\n continue\n }\n\n if (\n line.includes('|') &&\n i + 1 < lines.length &&\n TABLE_SEPARATOR.test(lines[i + 1] as string)\n ) {\n flush()\n const header = splitRow(line)\n const align = splitRow(lines[i + 1] as string).map((cell) => {\n const left = cell.startsWith(':')\n const right = cell.endsWith(':')\n if (left && right) return 'center'\n if (right) return 'right'\n if (left) return 'left'\n return null\n })\n const rows: string[][] = []\n i += 2\n while (i < lines.length && (lines[i] as string).includes('|')) {\n rows.push(splitRow(lines[i] as string))\n i += 1\n }\n blocks.push({ kind: 'table', header, align, rows })\n continue\n }\n\n paragraph.push(line)\n i += 1\n }\n flush()\n return blocks\n}\n\nfunction splitRow(line: string): string[] {\n const trimmed = line.trim().replace(/^\\|/, '').replace(/\\|$/, '')\n return trimmed.split(/(?<!\\\\)\\|/).map((cell) => cell.replace(/\\\\\\|/g, '|').trim())\n}\n\nfunction renderBlocks(blocks: Block[]): ReactNode[] {\n return blocks.map((block, index) => {\n switch (block.kind) {\n case 'paragraph':\n return (\n <p key={index}>\n {block.lines.map((line, n) => (\n <Fragment key={n}>\n {n > 0 && <br />}\n {renderInline(line)}\n </Fragment>\n ))}\n </p>\n )\n case 'heading': {\n const Tag = `h${Math.min(block.level + 2, 6)}` as 'h3' | 'h4' | 'h5' | 'h6'\n return <Tag key={index}>{renderInline(block.text)}</Tag>\n }\n case 'code':\n return (\n <pre key={index} data-lang={block.lang || undefined}>\n <code>{block.code}</code>\n </pre>\n )\n case 'quote':\n return <blockquote key={index}>{renderBlocks(block.blocks)}</blockquote>\n case 'list': {\n const items = block.items.map((item, n) => <li key={n}>{renderInline(item)}</li>)\n return block.ordered ? (\n <ol key={index} start={block.start === 1 ? undefined : block.start}>\n {items}\n </ol>\n ) : (\n <ul key={index}>{items}</ul>\n )\n }\n case 'table':\n return (\n <div key={index} className='agi-md__table'>\n <table>\n <thead>\n <tr>\n {block.header.map((cell, n) => (\n <th key={n} style={alignStyle(block.align[n])}>\n {renderInline(cell)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {block.rows.map((row, r) => (\n <tr key={r}>\n {block.header.map((_, n) => (\n <td key={n} style={alignStyle(block.align[n])}>\n {renderInline(row[n] ?? '')}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n case 'rule':\n return <hr key={index} />\n }\n })\n}\n\nfunction alignStyle(align: 'left' | 'center' | 'right' | null | undefined) {\n return align ? { textAlign: align } : undefined\n}\n\n/* ───────────────────────────── inline ───────────────────────────── */\n\nconst INLINE =\n /(`+)([\\s\\S]*?)\\1|\\*\\*([\\s\\S]+?)\\*\\*|(?<![\\w`])__([\\s\\S]+?)__(?![\\w])|~~([\\s\\S]+?)~~|\\*([^*\\n]+?)\\*|(?<![\\w`])_([^_\\n]+?)_(?![\\w])|\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)|(https?:\\/\\/[^\\s<]*[^\\s<.,;:!?)\\]'\"])/g\n\nexport function renderInline(text: string): ReactNode[] {\n const nodes: ReactNode[] = []\n let last = 0\n let key = 0\n // A fresh instance per call: the function recurses for nested emphasis, and a shared\n // global regex would have its lastIndex reset by the inner call.\n const inline = new RegExp(INLINE.source, 'g')\n let match = inline.exec(text)\n while (match) {\n if (match.index > last) nodes.push(text.slice(last, match.index))\n const [, , code, bold, boldAlt, strike, italic, italicAlt, linkText, linkHref, autoHref] = match\n if (code !== undefined) {\n nodes.push(<code key={key++}>{code.trim()}</code>)\n } else if (bold !== undefined || boldAlt !== undefined) {\n nodes.push(<strong key={key++}>{renderInline((bold ?? boldAlt) as string)}</strong>)\n } else if (strike !== undefined) {\n nodes.push(<del key={key++}>{renderInline(strike)}</del>)\n } else if (italic !== undefined || italicAlt !== undefined) {\n nodes.push(<em key={key++}>{renderInline((italic ?? italicAlt) as string)}</em>)\n } else if (linkText !== undefined && linkHref !== undefined) {\n nodes.push(link(key++, linkHref, renderInline(linkText)))\n } else if (autoHref !== undefined) {\n nodes.push(link(key++, autoHref, autoHref))\n }\n last = match.index + match[0].length\n match = inline.exec(text)\n }\n if (last < text.length) nodes.push(text.slice(last))\n return nodes\n}\n\nconst SAFE_HREF = /^(https?:\\/\\/|mailto:)/i\n\nfunction link(key: number, href: string, children: ReactNode): ReactNode {\n if (!SAFE_HREF.test(href)) return <Fragment key={key}>{children}</Fragment>\n return (\n <a key={key} href={href} target='_blank' rel='noopener noreferrer'>\n {children}\n </a>\n )\n}\n","/**\n * Structured replies: an agent may answer with a JSON document of items (text, buttons,\n * table, cards, pie, image) instead of prose. This mirrors the contract the platform's\n * hosted chat renders, so a workflow tuned for one renders identically in the widget.\n */\n\nexport interface StructuredButton {\n label: string\n action: string\n}\nexport interface StructuredTable {\n headers: string[]\n rows: string[][]\n}\nexport interface StructuredCard {\n title: string\n subtitle: string\n body: string\n image: string\n}\nexport interface StructuredPie {\n labels: string[]\n data: number[]\n}\nexport interface StructuredImage {\n url: string\n caption: string\n}\nexport interface StructuredItem {\n text: { content: string }\n buttons: StructuredButton[]\n table: StructuredTable\n cards: StructuredCard[]\n pie: StructuredPie\n image: StructuredImage\n}\nexport interface StructuredResponse {\n items: StructuredItem[]\n}\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\nconst isStringArray = (v: unknown): v is string[] =>\n Array.isArray(v) && v.every((x) => typeof x === 'string')\nconst isNumberArray = (v: unknown): v is number[] =>\n Array.isArray(v) && v.every((x) => typeof x === 'number')\n\nfunction isCard(v: unknown): v is StructuredCard {\n return (\n isObject(v) &&\n typeof v.title === 'string' &&\n typeof v.subtitle === 'string' &&\n typeof v.body === 'string' &&\n typeof v.image === 'string'\n )\n}\n\nfunction normaliseItem(raw: unknown): StructuredItem | null {\n if (!isObject(raw)) return null\n const text = raw.text\n const buttons = raw.buttons\n const table = raw.table\n const pie = raw.pie\n const image = raw.image\n const cards = Array.isArray(raw.cards) ? raw.cards : raw.card ? [raw.card] : []\n if (!isObject(text) || typeof text.content !== 'string') return null\n if (\n !Array.isArray(buttons) ||\n !buttons.every(\n (b) => isObject(b) && typeof b.label === 'string' && typeof b.action === 'string'\n )\n )\n return null\n if (\n !isObject(table) ||\n !isStringArray(table.headers) ||\n !Array.isArray(table.rows) ||\n !table.rows.every(isStringArray)\n )\n return null\n if (!cards.every(isCard)) return null\n if (!isObject(pie) || !isStringArray(pie.labels) || !isNumberArray(pie.data)) return null\n if (!isObject(image) || typeof image.url !== 'string' || typeof image.caption !== 'string')\n return null\n return {\n text: { content: text.content },\n buttons: buttons as StructuredButton[],\n table: table as unknown as StructuredTable,\n cards: cards as StructuredCard[],\n pie: pie as unknown as StructuredPie,\n image: image as unknown as StructuredImage,\n }\n}\n\n/** Parses a reply into a structured response, or null when it is ordinary prose. */\nexport function parseStructured(raw: string): StructuredResponse | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n const list = Array.isArray(parsed)\n ? parsed\n : isObject(parsed) && Array.isArray(parsed.items)\n ? parsed.items\n : null\n if (!list) return null\n const items = list.map(normaliseItem)\n if (items.some((i) => i === null)) return null\n return { items: items as StructuredItem[] }\n}\n\n/* ───────────────────────────── renderer ───────────────────────────── */\n\nexport interface StructuredUIProps {\n response: StructuredResponse\n /** Called with the button's action text; the widget sends it as the next message. */\n onAction?: (action: string) => void\n}\n\nexport function StructuredUI({ response, onAction }: StructuredUIProps) {\n return (\n <div className='agi-sui'>\n {response.items.map((item, i) => (\n <div key={i} className='agi-sui__item'>\n {item.text.content && <p className='agi-sui__text'>{item.text.content}</p>}\n {item.image.url && (\n <figure className='agi-sui__figure'>\n <img src={item.image.url} alt={item.image.caption} />\n {item.image.caption && <figcaption>{item.image.caption}</figcaption>}\n </figure>\n )}\n {item.cards.length > 0 && (\n <div className='agi-sui__cards'>\n {item.cards.map((c, ci) => (\n <div key={ci} className='agi-panel agi-sui__card'>\n {c.image && <img src={c.image} alt='' />}\n <div>\n <div className='agi-sui__card-title'>{c.title}</div>\n {c.subtitle && <div className='agi-sui__card-sub'>{c.subtitle}</div>}\n {c.body && <p>{c.body}</p>}\n </div>\n </div>\n ))}\n </div>\n )}\n {item.table.headers.length > 0 && (\n <div className='agi-sui__scroll'>\n <table className='agi-table'>\n <thead>\n <tr>\n {item.table.headers.map((h, hi) => (\n <th key={hi}>{h}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {item.table.rows.map((r, ri) => (\n <tr key={ri}>\n {r.map((cell, ci) => (\n <td key={ci}>{cell}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {item.pie.labels.length > 0 && <Pie labels={item.pie.labels} data={item.pie.data} />}\n {item.buttons.length > 0 && (\n <div className='agi-sui__actions'>\n {item.buttons.map((b, bi) => (\n <button\n key={bi}\n type='button'\n className='agi-chip'\n onClick={() => onAction?.(b.action)}\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n )\n}\n\nfunction Pie({ labels, data }: StructuredPie) {\n const total = data.reduce((a, b) => a + Math.max(0, b), 0)\n if (total <= 0) return null\n let angle = 0\n const slices = labels.map((label, i) => {\n const value = Math.max(0, data[i] ?? 0)\n const start = angle\n angle += (value / total) * 360\n return { label, value, start, end: angle, color: `var(--data-${(i % 6) + 1})` }\n })\n const arc = (start: number, end: number) => {\n const r = 48\n const cx = 50\n const cy = 50\n const a0 = ((start - 90) * Math.PI) / 180\n const a1 = ((end - 90) * Math.PI) / 180\n const large = end - start > 180 ? 1 : 0\n const x0 = cx + r * Math.cos(a0)\n const y0 = cy + r * Math.sin(a0)\n const x1 = cx + r * Math.cos(a1)\n const y1 = cy + r * Math.sin(a1)\n if (end - start >= 360) return `M${cx} ${cy - r} A${r} ${r} 0 1 1 ${cx - 0.01} ${cy - r} Z`\n return `M${cx} ${cy} L${x0} ${y0} A${r} ${r} 0 ${large} 1 ${x1} ${y1} Z`\n }\n return (\n <div className='agi-sui__pie'>\n <svg viewBox='0 0 100 100' role='img' aria-label={labels.join(', ')}>\n <title>{labels.join(', ')}</title>\n {slices.map((s) => (\n <path key={s.label} d={arc(s.start, s.end)} fill={s.color} />\n ))}\n </svg>\n <ul>\n {slices.map((s) => (\n <li key={s.label}>\n <span style={{ background: s.color }} />\n {s.label}\n <b>{Math.round((s.value / total) * 100)}%</b>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport { cx, Tag } from '../core'\n\n/**\n * Observability widgets. Data-driven: they render whatever the host passes, so they work\n * with the platform's log and stats endpoints, a data warehouse or static numbers alike.\n */\n\n/* ───────────────────────────── stat tiles ───────────────────────────── */\n\nexport interface StatItem {\n value: string\n label: string\n /** Small trend note, e.g. \"+4.2% vs last week\". */\n delta?: string\n tone?: 'default' | 'ok' | 'warn' | 'bad'\n}\n\nexport function StatTiles({\n items,\n className,\n ...props\n}: { items: StatItem[] } & HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cx('agi-stats', className)} {...props}>\n {items.map((s) => (\n <div key={s.label} className='agi-panel agi-stats__tile'>\n <div className={cx('agi-stat__v', s.tone && s.tone !== 'default' && `is-${s.tone}`)}>\n {s.value}\n </div>\n <div className='agi-stat__k'>{s.label}</div>\n {s.delta && <div className='agi-stats__delta'>{s.delta}</div>}\n </div>\n ))}\n </div>\n )\n}\n\n/* ───────────────────────────── success heatmap ───────────────────────────── */\n\nexport interface HeatmapRow {\n label: string\n /** Success rates 0–1 per column (e.g. per day or per hour); null for no runs. */\n values: Array<number | null>\n}\n\nexport interface SuccessHeatmapProps extends HTMLAttributes<HTMLDivElement> {\n rows: HeatmapRow[]\n /** Column labels, same length as each row's values. */\n columns?: string[]\n /** Below `warn` a cell reads as warning, below `bad` as failure. Defaults 0.95 / 0.85. */\n thresholds?: { warn: number; bad: number }\n /** Formats the tooltip; default \"97.2%\". */\n format?: (value: number) => string\n}\n\nconst pct = (v: number) => `${(v * 100).toFixed(1)}%`\n\nexport function SuccessHeatmap({\n rows,\n columns,\n thresholds = { warn: 0.95, bad: 0.85 },\n format = pct,\n className,\n ...props\n}: SuccessHeatmapProps) {\n const cols =\n columns ?? Array.from({ length: rows[0]?.values.length ?? 0 }, (_, i) => String(i + 1))\n return (\n <div className={cx('agi-heat', className)} {...props}>\n <table className='agi-heat__table'>\n <thead>\n <tr>\n <th className='agi-heat__label' />\n {cols.map((c) => (\n <th key={c} className='agi-heat__col' scope='col'>\n {c}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((r) => (\n <tr key={r.label}>\n <th className='agi-heat__label' scope='row'>\n {r.label}\n </th>\n {r.values.map((v, i) => {\n const tone =\n v === null\n ? 'none'\n : v < thresholds.bad\n ? 'bad'\n : v < thresholds.warn\n ? 'warn'\n : 'ok'\n return (\n <td key={i} className='agi-heat__td'>\n <span\n className={cx('agi-heat__cell', `is-${tone}`)}\n title={v === null ? '—' : format(v)}\n style={\n v === null\n ? undefined\n : { opacity: 0.35 + 0.65 * Math.min(1, Math.max(0, (v - 0.5) / 0.5)) }\n }\n />\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n <div className='agi-heat__legend'>\n <Tag tone='ok'>≥ {pct(thresholds.warn)}</Tag>\n <Tag tone='warn'>≥ {pct(thresholds.bad)}</Tag>\n <Tag tone='bad'>&lt; {pct(thresholds.bad)}</Tag>\n </div>\n </div>\n )\n}\n\n/* ───────────────────────────── run timeline ───────────────────────────── */\n\nexport interface TimelineStep {\n id: string\n name: string\n /** Step kind in the platform vocabulary; drives the glyph and colour. */\n kind?:\n | 'ingest'\n | 'plan'\n | 'retrieve'\n | 'reason'\n | 'tool'\n | 'verify'\n | 'approval'\n | 'write'\n | 'notify'\n status: 'done' | 'running' | 'error' | 'waiting'\n /** Offset from the run start in ms. */\n startMs: number\n durationMs?: number\n tokens?: number\n costUsd?: number\n detail?: string\n}\n\nconst GLYPH: Record<NonNullable<TimelineStep['kind']>, string> = {\n ingest: '◦',\n plan: '⌘',\n retrieve: '⌕',\n reason: '∿',\n tool: '⚙',\n verify: '✓',\n approval: '⏸',\n write: '⇢',\n notify: '➤',\n}\n\nconst fmtMs = (x: number) => (x < 1000 ? `${Math.round(x)} ms` : `${(x / 1000).toFixed(1)} s`)\n\nexport interface RunTimelineProps extends HTMLAttributes<HTMLOListElement> {\n steps: TimelineStep[]\n /** Total run duration for the bar scale; defaults to the last step's end. */\n totalMs?: number\n}\n\nexport function RunTimeline({ steps, totalMs, className, ...props }: RunTimelineProps) {\n const end = totalMs ?? Math.max(1, ...steps.map((s) => s.startMs + (s.durationMs ?? 0)))\n return (\n <ol className={cx('agi-timeline', className)} {...props}>\n {steps.map((s) => (\n <li\n key={s.id}\n className={cx('agi-timeline__step', `is-${s.status}`, s.kind && `k-${s.kind}`)}\n >\n <span className='agi-timeline__glyph' aria-hidden='true'>\n {s.kind ? GLYPH[s.kind] : '•'}\n </span>\n <span className='agi-timeline__name'>\n {s.name}\n {s.detail && <span className='agi-timeline__detail'>{s.detail}</span>}\n </span>\n <span className='agi-timeline__bar' aria-hidden='true'>\n <span\n className='agi-timeline__fill'\n style={{\n left: `${(s.startMs / end) * 100}%`,\n width: `${Math.max(1, ((s.durationMs ?? 0) / end) * 100)}%`,\n }}\n />\n </span>\n <span className='agi-timeline__meta'>\n {s.durationMs !== undefined && fmtMs(s.durationMs)}\n {s.tokens !== undefined && ` · ${s.tokens} tok`}\n {s.costUsd !== undefined && ` · $${s.costUsd.toFixed(3)}`}\n </span>\n </li>\n ))}\n </ol>\n )\n}\n\n/* ───────────────────────────── cost bars ───────────────────────────── */\n\nexport interface CostBarItem {\n label: string\n value: number\n /** Optional right-hand caption, e.g. \"1,240 runs\". */\n note?: string\n}\n\nexport interface CostBarsProps extends HTMLAttributes<HTMLDivElement> {\n items: CostBarItem[]\n /** Formats the value; default USD with two decimals. */\n format?: (value: number) => string\n}\n\nconst usd = (v: number) => `$${v.toFixed(2)}`\n\nexport function CostBars({ items, format = usd, className, ...props }: CostBarsProps) {\n const max = Math.max(1e-9, ...items.map((i) => i.value))\n return (\n <div className={cx('agi-bars', className)} {...props}>\n {items.map((i, idx) => (\n <div key={i.label} className='agi-bars__row'>\n <span className='agi-bars__label'>{i.label}</span>\n <span className='agi-bars__track' aria-hidden='true'>\n <span\n className='agi-bars__fill'\n style={{\n width: `${(i.value / max) * 100}%`,\n background: `var(--data-${(idx % 6) + 1})`,\n }}\n />\n </span>\n <span className='agi-bars__value'>\n {format(i.value)}\n {i.note && <span className='agi-bars__note'>{i.note}</span>}\n </span>\n </div>\n ))}\n </div>\n )\n}\n","import { type FormEvent, useCallback, useEffect, useRef, useState } from 'react'\nimport { AginiesError } from '../client'\nimport { Button, cx, Field, Input, Panel, Spinner, Tag, Textarea } from '../core'\nimport { useAginies, useModule } from '../provider'\nimport { type RunEvent, runAgent } from './run-client'\n\nexport interface RunStep {\n blockId: string\n name: string\n status: 'running' | 'done' | 'error'\n durationMs?: number\n}\n\nexport type RunStatus = 'idle' | 'running' | 'done' | 'error'\n\n/**\n * State for one deployed agent: run it with structured input, follow the streamed text\n * and steps, read the final output. `AgentRunner` renders it; use the hook for a custom UI.\n */\nexport function useAgentRun(workflowId: string, apiKey: string) {\n const { client, t } = useAginies()\n const [status, setStatus] = useState<RunStatus>('idle')\n const [text, setText] = useState('')\n const [steps, setSteps] = useState<RunStep[]>([])\n const [output, setOutput] = useState<unknown>(null)\n const [error, setError] = useState<string | null>(null)\n const [executionId, setExecutionId] = useState<string | undefined>()\n const abortRef = useRef<AbortController | null>(null)\n\n const cancel = useCallback(() => {\n abortRef.current?.abort()\n abortRef.current = null\n setStatus((s) => (s === 'running' ? 'idle' : s))\n }, [])\n\n const run = useCallback(\n async (input: unknown) => {\n abortRef.current?.abort()\n const controller = new AbortController()\n abortRef.current = controller\n setStatus('running')\n setText('')\n setSteps([])\n setOutput(null)\n setError(null)\n try {\n for await (const ev of runAgent(client, workflowId, { apiKey, input }, controller.signal)) {\n apply(ev)\n }\n } catch (err) {\n if (controller.signal.aborted) return\n setError(\n err instanceof AginiesError && err.code === 'UNAUTHORIZED'\n ? t('run', 'unauthorized')\n : err instanceof Error\n ? err.message\n : t('run', 'failed')\n )\n setStatus('error')\n } finally {\n if (abortRef.current === controller) abortRef.current = null\n }\n\n function apply(ev: RunEvent) {\n switch (ev.type) {\n case 'started':\n setExecutionId(ev.executionId)\n break\n case 'chunk':\n setText((s) => s + ev.text)\n break\n case 'step':\n setSteps((prev) => {\n const i = prev.findIndex((s) => s.blockId === ev.blockId)\n const next: RunStep = {\n blockId: ev.blockId,\n name: ev.name,\n status: ev.status,\n durationMs: ev.durationMs,\n }\n if (i === -1) return [...prev, next]\n const copy = [...prev]\n copy[i] = next\n return copy\n })\n break\n case 'done':\n setOutput(ev.output)\n setStatus(ev.success ? 'done' : 'error')\n break\n case 'error':\n setError(ev.message)\n setStatus('error')\n break\n }\n }\n },\n [client, workflowId, apiKey, t]\n )\n\n return { status, text, steps, output, error, executionId, run, cancel }\n}\n\n/* ───────────────────────────── component ───────────────────────────── */\n\nexport interface RunField {\n name: string\n label: string\n type?: 'text' | 'textarea' | 'number' | 'select' | 'boolean'\n required?: boolean\n placeholder?: string\n options?: Array<{ value: string; label: string }>\n defaultValue?: string | number | boolean\n}\n\nexport interface AgentRunnerProps {\n /** Id of the deployed agent (workflow). */\n workflowId: string\n /** An `execute`-scoped API key for this agent. Visible to the page; never a personal key. */\n apiKey: string\n /** Form fields; their values become the agent's input object. Omit for a single text box. */\n fields?: RunField[]\n title?: string\n description?: string\n submitLabel?: string\n /** Called with the final output of a successful run. */\n onResult?: (output: unknown) => void\n className?: string\n}\n\nconst DEFAULT_FIELDS: RunField[] = [\n { name: 'input', label: 'Input', type: 'textarea', required: true },\n]\n\nexport function AgentRunner({\n workflowId,\n apiKey,\n fields = DEFAULT_FIELDS,\n title,\n description,\n submitLabel,\n onResult,\n className,\n}: AgentRunnerProps) {\n const { t } = useAginies()\n const enabled = useModule('run')\n const agent = useAgentRun(workflowId, apiKey)\n const [values, setValues] = useState<Record<string, string | number | boolean>>(() =>\n Object.fromEntries(\n fields.map((f) => [f.name, f.defaultValue ?? (f.type === 'boolean' ? false : '')])\n )\n )\n const set = (name: string, value: string | number | boolean) =>\n setValues((v) => ({ ...v, [name]: value }))\n\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n if (agent.status === 'running') return\n const input =\n fields.length === 1 && fields[0]?.name === 'input' && fields[0]?.type === 'textarea'\n ? values.input\n : values\n await agent.run(input)\n }\n const onResultRef = useRef(onResult)\n onResultRef.current = onResult\n useEffect(() => {\n if (agent.status === 'done') onResultRef.current?.(agent.output)\n }, [agent.status, agent.output])\n if (!enabled) return null\n\n return (\n <Panel className={cx('agi-run', className)}>\n {(title || description) && (\n <header className='agi-run__head'>\n {title && <h3 className='agi-run__title'>{title}</h3>}\n {description && <p className='agi-run__desc'>{description}</p>}\n </header>\n )}\n <form className='agi-run__form' onSubmit={submit}>\n {fields.map((f) => (\n <Field key={f.name} label={f.label}>\n {f.type === 'textarea' ? (\n <Textarea\n required={f.required}\n placeholder={f.placeholder}\n value={String(values[f.name] ?? '')}\n onChange={(e) => set(f.name, e.target.value)}\n />\n ) : f.type === 'select' ? (\n <select\n className='agi-input'\n required={f.required}\n value={String(values[f.name] ?? '')}\n onChange={(e) => set(f.name, e.target.value)}\n >\n <option value=''>—</option>\n {f.options?.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n ) : f.type === 'boolean' ? (\n <input\n type='checkbox'\n className='agi-checkbox'\n checked={Boolean(values[f.name])}\n onChange={(e) => set(f.name, e.target.checked)}\n />\n ) : (\n <Input\n type={f.type === 'number' ? 'number' : 'text'}\n required={f.required}\n placeholder={f.placeholder}\n value={String(values[f.name] ?? '')}\n onChange={(e) =>\n set(f.name, f.type === 'number' ? Number(e.target.value) : e.target.value)\n }\n />\n )}\n </Field>\n ))}\n <div className='agi-run__actions'>\n {agent.status === 'running' ? (\n <Button variant='outline' onClick={agent.cancel}>\n {t('run', 'cancel')}\n </Button>\n ) : (\n <Button variant='signal' type='submit'>\n {submitLabel ?? t('run', 'submit')}\n </Button>\n )}\n {agent.status === 'running' && (\n <span className='agi-run__status'>\n <Spinner label={t('run', 'running')} /> {t('run', 'running')}\n </span>\n )}\n {agent.status === 'done' && <Tag tone='ok'>{t('run', 'done')}</Tag>}\n {agent.status === 'error' && <Tag tone='bad'>{t('run', 'error')}</Tag>}\n </div>\n </form>\n\n {agent.steps.length > 0 && (\n <ol className='agi-run__steps' aria-label={t('run', 'steps')}>\n {agent.steps.map((s) => (\n <li key={s.blockId} className={`agi-run__step is-${s.status}`}>\n <span className='agi-run__step-dot' />\n <span className='agi-run__step-name'>{s.name}</span>\n {s.durationMs !== undefined && (\n <span className='agi-run__step-meta'>{s.durationMs} ms</span>\n )}\n </li>\n ))}\n </ol>\n )}\n\n {(agent.text || agent.output !== null || agent.error) && (\n <section className='agi-run__result' aria-live='polite'>\n {agent.error && <p className='agi-run__error'>{agent.error}</p>}\n {agent.text && <p className='agi-run__text'>{agent.text}</p>}\n {!agent.text && agent.output !== null && (\n <pre className='agi-run__output'>{formatOutput(agent.output)}</pre>\n )}\n {agent.executionId && (\n <p className='agi-run__meta'>\n {t('run', 'execution')} <b>{agent.executionId}</b>\n </p>\n )}\n </section>\n )}\n </Panel>\n )\n}\n\nfunction formatOutput(output: unknown): string {\n if (typeof output === 'string') return output\n try {\n return JSON.stringify(output, null, 2)\n } catch {\n return String(output)\n }\n}\n","/**\n * Runs a deployed agent through `POST /api/workflows/:id/execute` and normalises its\n * server-sent events. The platform emits two shapes depending on the run mode — the\n * executor's typed events (`stream:chunk`, `block:completed`, `execution:completed`, …)\n * and the streaming-response shape shared with chat (`{ blockId, chunk }`, `{ event:\n * 'final', data }`) — and both are folded into one small event vocabulary here.\n */\nimport { type AginiesClient, AginiesError } from '../client'\n\nexport type RunEvent =\n | { type: 'started'; executionId?: string }\n | { type: 'chunk'; blockId?: string; text: string }\n | {\n type: 'step'\n blockId: string\n name: string\n status: 'running' | 'done' | 'error'\n durationMs?: number\n }\n | { type: 'done'; output: unknown; success: boolean }\n | { type: 'error'; message: string }\n\nexport interface RunOptions {\n /** An `execute`-scoped API key. It is visible to the browser: scope it to this agent only. */\n apiKey: string\n /** Free-form or structured input for the agent's start block. */\n input?: unknown\n /** Outputs to stream, as `blockId_path` or `Block name.path`. */\n selectedOutputs?: string[]\n}\n\nexport async function* runAgent(\n client: AginiesClient,\n workflowId: string,\n options: RunOptions,\n signal?: AbortSignal\n): AsyncGenerator<RunEvent> {\n const res = await client.fetchRaw(`/api/workflows/${encodeURIComponent(workflowId)}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': options.apiKey,\n 'X-Stream-Response': 'true',\n },\n credentials: 'omit',\n body: JSON.stringify({\n input: options.input,\n stream: true,\n triggerType: 'api',\n selectedOutputs: options.selectedOutputs,\n }),\n signal,\n })\n const executionId = res.headers.get('X-Execution-Id') ?? undefined\n if (!res.ok) {\n let message = `HTTP ${res.status}`\n try {\n const body = (await res.json()) as { error?: string }\n if (body.error) message = body.error\n } catch {\n /* body was not JSON */\n }\n throw new AginiesError(message, res.status, res.status === 401 ? 'UNAUTHORIZED' : undefined)\n }\n yield { type: 'started', executionId }\n const contentType = res.headers.get('content-type') ?? ''\n if (!contentType.includes('text/event-stream')) {\n const body = (await res.json()) as { success?: boolean; output?: unknown; error?: string }\n if (body.success === false) yield { type: 'error', message: body.error ?? 'Run failed' }\n else yield { type: 'done', output: body.output ?? body, success: true }\n return\n }\n yield* parseRunSSE(res.body as ReadableStream<Uint8Array>)\n}\n\n/** Decodes an execute SSE body into run events. Exported for tests. */\nexport async function* parseRunSSE(stream: ReadableStream<Uint8Array>): AsyncGenerator<RunEvent> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let finished = false\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n let sep = buffer.indexOf('\\n\\n')\n while (sep !== -1) {\n const ev = decodeRunFrame(buffer.slice(0, sep))\n buffer = buffer.slice(sep + 2)\n if (ev) {\n if (ev.type === 'done' || ev.type === 'error') finished = true\n yield ev\n }\n sep = buffer.indexOf('\\n\\n')\n }\n }\n const tail = decodeRunFrame(buffer)\n if (tail) {\n if (tail.type === 'done' || tail.type === 'error') finished = true\n yield tail\n }\n } finally {\n reader.releaseLock()\n }\n if (!finished) yield { type: 'done', output: null, success: true }\n}\n\nfunction decodeRunFrame(frame: string): RunEvent | null {\n const line = frame.split('\\n').find((l) => l.startsWith('data:'))\n if (!line) return null\n const data = line.slice(5).trim()\n if (!data || data === '[DONE]') return null\n let json: Record<string, unknown>\n try {\n json = JSON.parse(data)\n } catch {\n return { type: 'chunk', text: data }\n }\n const d = (json.data ?? {}) as Record<string, unknown>\n switch (json.type) {\n case 'stream:chunk':\n return { type: 'chunk', blockId: d.blockId as string, text: String(d.chunk ?? '') }\n case 'block:started':\n return {\n type: 'step',\n blockId: String(d.blockId),\n name: String(d.blockName ?? d.blockType ?? ''),\n status: 'running',\n }\n case 'block:completed':\n return {\n type: 'step',\n blockId: String(d.blockId),\n name: String(d.blockName ?? d.blockType ?? ''),\n status: 'done',\n durationMs: d.durationMs as number | undefined,\n }\n case 'block:error':\n return {\n type: 'step',\n blockId: String(d.blockId),\n name: String(d.blockName ?? d.blockType ?? ''),\n status: 'error',\n durationMs: d.durationMs as number | undefined,\n }\n case 'execution:completed':\n return { type: 'done', output: d.output, success: d.success !== false }\n case 'execution:error':\n return { type: 'error', message: String(d.error ?? 'Run failed') }\n case 'execution:cancelled':\n return { type: 'error', message: 'Run cancelled' }\n case 'execution:started':\n case 'stream:done':\n return null\n }\n // streaming-response shape\n if (json.event === 'error') return { type: 'error', message: String(json.error ?? 'Run failed') }\n if (json.event === 'final') {\n const fd = (json.data ?? {}) as { success?: boolean; output?: unknown; error?: unknown }\n if (fd.success === false) {\n const err = fd.error\n return {\n type: 'error',\n message:\n typeof err === 'string' ? err : ((err as { message?: string })?.message ?? 'Run failed'),\n }\n }\n return { type: 'done', output: fd.output ?? fd, success: true }\n }\n if (typeof json.chunk === 'string')\n return { type: 'chunk', blockId: json.blockId as string | undefined, text: json.chunk }\n return null\n}\n"],"mappings":"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","names":["body","init","path","useEffect","useMemo","useState","Button","Input","Textarea","jsx","Fragment","jsx","jsxs","useState","useMemo","useEffect","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","Tag","jsx","jsxs","cx","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","text","jsx","jsxs","useCallback","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useCallback","useEffect"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/approval/approval-client.ts","../src/approval/approval-panel.tsx","../src/core/index.tsx","../src/provider.tsx","../src/i18n.ts","../src/chat/chat-widget.tsx","../src/chat/markdown.tsx","../src/chat/structured-ui.tsx","../src/chat/voice.ts","../src/observability/index.tsx","../src/run/agent-runner.tsx","../src/run/run-client.ts"],"sourcesContent":["/**\n * Thin browser client for the Aginies platform: activation handshake, hosted-chat\n * configuration and streaming chat turns. No framework dependency; the React layer\n * wraps it.\n */\n\nexport interface AginiesConfig {\n /** Platform origin, e.g. `https://app.example.com`. No trailing slash. */\n baseUrl: string\n /** Activation token issued for the deployment. Without it nothing renders, unless `hosted`. */\n token?: string\n /**\n * The platform's own pages: the widget runs on the platform origin and activates\n * without a token. Refused from any other origin.\n */\n hosted?: boolean\n /** UI language. Defaults to the document language, then English. */\n locale?: 'tr' | 'en'\n /** Fetch implementation override (tests, SSR). */\n fetch?: typeof fetch\n}\n\nexport interface ActivationConfig {\n apiBase: string\n brand: { name: string; logoUrl: string | null }\n theme: Record<string, string | undefined> | null\n /** Widget modules the activation unlocks; empty means all. */\n modules?: string[]\n /** The tenant a tenant key belongs to. Absent for a static activation key. */\n tenant?: { id: string; name: string }\n}\n\n/**\n * The session a tenant key buys: a short-lived bearer the client sends on every\n * platform call and renews by re-activating when it is refused.\n */\nexport interface ActivationSession {\n token: string\n /** Unix seconds. */\n expiresAt: number\n}\n\nexport type ActivationState =\n | { status: 'idle' }\n | { status: 'activating' }\n | { status: 'active'; config: ActivationConfig }\n | { status: 'rejected'; reason: string }\n\nexport interface ChatConfig {\n id: string\n title: string\n description: string\n customizations: {\n primaryColor?: string\n welcomeMessage?: string\n imageUrl?: string\n logoUrl?: string\n headerText?: string\n }\n authType: 'public' | 'password' | 'email' | 'sso'\n outputConfigs?: Array<{ blockId: string; path?: string }>\n /** What the platform can do with speech for this chat. */\n voice?: { stt: boolean; tts: boolean }\n}\n\nexport interface Transcription {\n transcript: string\n language?: string\n duration?: number\n}\n\nexport interface ChatAuthRequired {\n authRequired: ChatConfig['authType']\n title?: string\n description?: string\n}\n\nexport interface ChatFilePayload {\n name: string\n type: string\n size: number\n data: string\n lastModified?: number\n}\n\nexport interface SendMessageInput {\n input?: string\n conversationId?: string\n password?: string\n email?: string\n files?: ChatFilePayload[]\n}\n\n/** One server-sent event from a chat turn, already decoded. */\nexport type ChatStreamEvent =\n | { type: 'chunk'; blockId?: string; text: string }\n | { type: 'final'; data: unknown }\n | { type: 'error'; message: string }\n | { type: 'done' }\n\nexport class AginiesError extends Error {\n readonly status: number\n readonly code?: string\n constructor(message: string, status: number, code?: string) {\n super(message)\n this.name = 'AginiesError'\n this.status = status\n this.code = code\n }\n}\n\nconst trimSlash = (s: string) => s.replace(/\\/+$/, '')\n\nexport class AginiesClient {\n readonly baseUrl: string\n readonly token: string | null\n private readonly hosted: boolean\n readonly locale: 'tr' | 'en'\n private readonly fetchImpl: typeof fetch\n private state: ActivationState = { status: 'idle' }\n private listeners = new Set<(s: ActivationState) => void>()\n private activation: Promise<ActivationState> | null = null\n private session: ActivationSession | null = null\n\n constructor(config: AginiesConfig) {\n if (!config?.baseUrl) throw new AginiesError('baseUrl is required', 0, 'MISSING_BASE_URL')\n if (!config?.token && !config?.hosted) {\n throw new AginiesError('token is required', 0, 'MISSING_TOKEN')\n }\n this.baseUrl = trimSlash(config.baseUrl)\n this.token = config.token ?? null\n this.hosted = config.hosted === true\n this.locale = config.locale ?? detectLocale()\n this.fetchImpl = config.fetch ?? ((...args) => fetch(...args))\n }\n\n getState(): ActivationState {\n return this.state\n }\n\n subscribe(listener: (s: ActivationState) => void): () => void {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n private setState(next: ActivationState) {\n this.state = next\n for (const l of this.listeners) l(next)\n }\n\n /**\n * Runs the activation handshake once and caches the outcome. Components render only\n * while the state is `active`; a rejected activation is final for this client.\n */\n activate(): Promise<ActivationState> {\n if (this.activation) return this.activation\n this.setState({ status: 'activating' })\n this.activation = (async () => {\n try {\n const res = await this.fetchImpl(`${this.baseUrl}/api/ui/activate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(this.hosted ? { hosted: true } : { token: this.token }),\n })\n if (!res.ok) {\n const body = await safeJson(res)\n const reason = (body && (body.error as string)) || `HTTP ${res.status}`\n this.setState({ status: 'rejected', reason })\n return this.state\n }\n const body = (await res.json()) as {\n activated?: boolean\n config?: ActivationConfig\n session?: ActivationSession\n }\n if (!body.activated || !body.config) {\n this.setState({ status: 'rejected', reason: 'Activation refused' })\n return this.state\n }\n this.session = body.session ?? null\n this.setState({ status: 'active', config: body.config })\n return this.state\n } catch (err) {\n this.setState({\n status: 'rejected',\n reason: err instanceof Error ? err.message : 'Activation failed',\n })\n return this.state\n }\n })()\n return this.activation\n }\n\n private assertActive() {\n if (this.state.status !== 'active') {\n throw new AginiesError('Client is not activated', 0, 'NOT_ACTIVATED')\n }\n }\n\n /** The current tenant session, if the activation issued one. */\n getSession(): ActivationSession | null {\n return this.session\n }\n\n /** Whether `module` may render under this activation. */\n hasModule(module: string): boolean {\n if (this.state.status !== 'active') return false\n const modules = this.state.config.modules ?? []\n return modules.length === 0 || modules.includes(module)\n }\n\n /**\n * Re-runs the handshake to obtain a fresh session. Used when a call is refused with\n * an expired bearer; the activation state stays `active` unless the platform now\n * rejects the key.\n */\n private async renewSession(): Promise<boolean> {\n this.activation = null\n const state = await this.activate()\n return state.status === 'active' && this.session !== null\n }\n\n private withSession(init: RequestInit): RequestInit {\n if (!this.session) return init\n const headers = new Headers(init.headers ?? {})\n if (!headers.has('Authorization')) headers.set('Authorization', `Bearer ${this.session.token}`)\n return { ...init, headers }\n }\n\n /**\n * A platform request carrying cookies and, when a tenant session exists, its bearer.\n * A 401/403 on a session that has expired triggers one renewal and one retry.\n */\n private async request(path: string, init: RequestInit = {}): Promise<Response> {\n const url = `${this.baseUrl}${path.startsWith('/') ? path : `/${path}`}`\n const send = () => this.fetchImpl(url, this.withSession({ credentials: 'include', ...init }))\n let res = await send()\n if (\n this.session &&\n (res.status === 401 || res.status === 403) &&\n this.session.expiresAt * 1000 <= Date.now() + 5_000\n ) {\n if (await this.renewSession()) res = await send()\n }\n return res\n }\n\n /** A raw request against the platform for endpoints the client does not wrap. */\n fetchRaw(path: string, init: RequestInit = {}): Promise<Response> {\n this.assertActive()\n return this.request(path, init)\n }\n\n /** Sends a recording to the platform's transcription model. */\n async transcribe(\n identifier: string,\n audio: Blob,\n filename = 'turn.webm',\n language?: string\n ): Promise<Transcription> {\n this.assertActive()\n const form = new FormData()\n form.append('file', audio, filename)\n if (language) form.append('language', language)\n const res = await this.request(`/api/chat/${encodeURIComponent(identifier)}/voice/transcribe`, {\n method: 'POST',\n body: form,\n })\n if (!res.ok) throw await voiceError(res)\n return (await res.json()) as Transcription\n }\n\n /** Audio for a reply from the platform's synthesis endpoint. */\n async speak(identifier: string, text: string): Promise<Blob> {\n this.assertActive()\n const res = await this.request(`/api/chat/${encodeURIComponent(identifier)}/voice/speak`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text }),\n })\n if (!res.ok) throw await voiceError(res)\n return res.blob()\n }\n\n /** Hosted-chat configuration. Resolves to an auth requirement instead of throwing on 401. */\n async getChat(identifier: string): Promise<ChatConfig | ChatAuthRequired> {\n this.assertActive()\n const res = await this.request(`/api/chat/${encodeURIComponent(identifier)}`)\n const body = await safeJson(res)\n if (res.status === 401 && body && typeof body.authRequired === 'string') {\n return body as unknown as ChatAuthRequired\n }\n if (!res.ok) {\n throw new AginiesError((body?.error as string) || `HTTP ${res.status}`, res.status)\n }\n return body as unknown as ChatConfig\n }\n\n /**\n * Sends one turn and yields the streamed events. Authentication for password / e-mail\n * chats travels in the same body on the first call; the platform then sets a cookie.\n */\n async *sendMessage(\n identifier: string,\n input: SendMessageInput,\n signal?: AbortSignal\n ): AsyncGenerator<ChatStreamEvent> {\n this.assertActive()\n const res = await this.request(`/api/chat/${encodeURIComponent(identifier)}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n signal,\n })\n if (!res.ok) {\n const body = await safeJson(res)\n if (res.status === 401 && body && typeof body.authRequired === 'string') {\n throw new AginiesError('Authentication required', 401, 'AUTH_REQUIRED')\n }\n throw new AginiesError((body?.error as string) || `HTTP ${res.status}`, res.status)\n }\n const contentType = res.headers.get('content-type') ?? ''\n if (!contentType.includes('text/event-stream')) {\n const body = await safeJson(res)\n yield { type: 'final', data: body }\n yield { type: 'done' }\n return\n }\n yield* parseSSE(res.body as ReadableStream<Uint8Array>)\n }\n}\n\n/** Parses an SSE body into chat events. Exported for tests. */\nexport async function* parseSSE(\n stream: ReadableStream<Uint8Array>\n): AsyncGenerator<ChatStreamEvent> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n let sep = buffer.indexOf('\\n\\n')\n while (sep !== -1) {\n const frame = buffer.slice(0, sep)\n buffer = buffer.slice(sep + 2)\n const event = decodeFrame(frame)\n if (event) yield event\n sep = buffer.indexOf('\\n\\n')\n }\n }\n const tail = decodeFrame(buffer)\n if (tail) yield tail\n } finally {\n reader.releaseLock()\n }\n yield { type: 'done' }\n}\n\nfunction decodeFrame(frame: string): ChatStreamEvent | null {\n const line = frame.split('\\n').find((l) => l.startsWith('data:'))\n if (!line) return null\n const data = line.slice(5).trim()\n if (!data || data === '[DONE]') return null\n let json: Record<string, unknown>\n try {\n json = JSON.parse(data)\n } catch {\n return { type: 'chunk', text: data }\n }\n if (json.event === 'error') {\n return { type: 'error', message: (json.error as string) || 'Stream error' }\n }\n if (json.event === 'final') {\n return { type: 'final', data: json.data }\n }\n if (typeof json.chunk === 'string') {\n return { type: 'chunk', blockId: json.blockId as string | undefined, text: json.chunk }\n }\n return null\n}\n\nasync function voiceError(res: Response): Promise<AginiesError> {\n const body = await safeJson(res)\n if (res.status === 401 && body && typeof body.authRequired === 'string') {\n return new AginiesError('Authentication required', 401, 'AUTH_REQUIRED')\n }\n if (res.status === 503)\n return new AginiesError('Voice is not available', 503, 'VOICE_UNAVAILABLE')\n return new AginiesError((body?.error as string) || `HTTP ${res.status}`, res.status)\n}\n\nasync function safeJson(res: Response): Promise<Record<string, unknown> | null> {\n try {\n return (await res.json()) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nfunction detectLocale(): 'tr' | 'en' {\n if (typeof document !== 'undefined') {\n const lang = document.documentElement.lang?.toLowerCase() ?? ''\n if (lang.startsWith('tr')) return 'tr'\n }\n if (typeof navigator !== 'undefined' && navigator.language?.toLowerCase().startsWith('tr')) {\n return 'tr'\n }\n return 'en'\n}\n","/**\n * Human-in-the-loop approvals. A run that reaches a \"Human in the Loop\" block pauses;\n * the platform stores its state and hands out a resume link. This module reads the\n * paused execution (`GET /api/resume/:workflowId/:executionId[/:contextId]`) and resumes\n * it with the approver's input (`POST …/:contextId`), through the activated client so a\n * tenant session travels along.\n */\nimport { type AginiesClient, AginiesError } from '../client'\n\nexport type ResumeStatus = 'paused' | 'resumed' | 'failed' | 'queued' | 'resuming'\n\nexport interface ResumeQueueEntry {\n id: string\n contextId: string\n status: string\n queuedAt: string | null\n claimedAt: string | null\n completedAt: string | null\n failureReason: string | null\n newExecutionId: string\n resumeInput: unknown\n}\n\nexport interface PausePoint {\n contextId: string\n triggerBlockId: string\n /** The block's paused output; `data.inputFormat` describes the approver's form. */\n response: { data?: Record<string, unknown> } | null\n registeredAt: string\n resumeStatus: ResumeStatus\n snapshotReady: boolean\n queuePosition?: number | null\n latestResumeEntry?: ResumeQueueEntry | null\n}\n\nexport interface PausedExecution {\n id: string\n workflowId: string\n executionId: string\n status: string\n totalPauseCount: number\n resumedCount: number\n pausedAt: string | null\n updatedAt: string | null\n expiresAt: string | null\n metadata: Record<string, unknown> | null\n pausePoints: PausePoint[]\n queue?: ResumeQueueEntry[]\n}\n\nexport interface PauseContext {\n execution: PausedExecution\n pausePoint: PausePoint\n queue: ResumeQueueEntry[]\n activeResumeEntry?: ResumeQueueEntry | null\n}\n\nexport interface ResumeOutcome {\n status: 'started' | 'queued'\n executionId: string\n queuePosition?: number | null\n message?: string\n}\n\n/** One field of the approver's form, as the block author configured it. */\nexport interface ResumeField {\n id: string\n name: string\n label: string\n type: string\n description?: string\n placeholder?: string\n value?: unknown\n required: boolean\n options?: unknown[]\n rows?: number\n}\n\nconst path = (workflowId: string, executionId: string, contextId?: string) =>\n `/api/resume/${encodeURIComponent(workflowId)}/${encodeURIComponent(executionId)}${\n contextId ? `/${encodeURIComponent(contextId)}` : ''\n }`\n\nasync function readJson<T>(res: Response): Promise<T> {\n let body: unknown = null\n try {\n body = await res.json()\n } catch {\n /* not JSON */\n }\n if (!res.ok) {\n const error = (body as { error?: string } | null)?.error\n throw new AginiesError(\n error || `HTTP ${res.status}`,\n res.status,\n res.status === 404 ? 'NOT_FOUND' : res.status === 403 ? 'FORBIDDEN' : undefined\n )\n }\n return body as T\n}\n\nexport function getPausedExecution(\n client: AginiesClient,\n workflowId: string,\n executionId: string\n): Promise<PausedExecution> {\n return client.fetchRaw(path(workflowId, executionId)).then((r) => readJson<PausedExecution>(r))\n}\n\nexport function getPauseContext(\n client: AginiesClient,\n workflowId: string,\n executionId: string,\n contextId: string\n): Promise<PauseContext> {\n return client\n .fetchRaw(path(workflowId, executionId, contextId))\n .then((r) => readJson<PauseContext>(r))\n}\n\nexport function listPausedExecutions(\n client: AginiesClient,\n workflowId: string,\n status?: string\n): Promise<PausedExecution[]> {\n const query = status ? `?status=${encodeURIComponent(status)}` : ''\n return client\n .fetchRaw(`/api/workflows/${encodeURIComponent(workflowId)}/paused${query}`)\n .then((r) => readJson<{ pausedExecutions: PausedExecution[] }>(r))\n .then((b) => b.pausedExecutions ?? [])\n}\n\n/** Resumes one pause point with the approver's submission, keyed by field name. */\nexport function resumeExecution(\n client: AginiesClient,\n workflowId: string,\n executionId: string,\n contextId: string,\n submission: Record<string, unknown> | null\n): Promise<ResumeOutcome> {\n return client\n .fetchRaw(path(workflowId, executionId, contextId), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(submission ? { input: { submission } } : {}),\n })\n .then((r) => readJson<ResumeOutcome>(r))\n}\n\n/* ───────────────────────────── form helpers ───────────────────────────── */\n\n/** Reads the approver's form out of a pause point, tolerating partial definitions. */\nexport function fieldsOf(point: PausePoint | null | undefined): ResumeField[] {\n const raw = point?.response?.data?.inputFormat\n if (!Array.isArray(raw)) return []\n return raw\n .map((f, index): ResumeField | null => {\n if (!f || typeof f !== 'object') return null\n const field = f as Record<string, unknown>\n const name = typeof field.name === 'string' ? field.name.trim() : ''\n if (!name) return null\n const str = (v: unknown) => (typeof v === 'string' && v.trim() ? v.trim() : undefined)\n return {\n id: str(field.id) ?? `field_${index}`,\n name,\n label: str(field.label) ?? name,\n type: str(field.type) ?? 'string',\n description: str(field.description),\n placeholder: str(field.placeholder),\n value: field.value,\n required: field.required === true,\n options: Array.isArray(field.options) ? field.options : undefined,\n rows: typeof field.rows === 'number' ? field.rows : undefined,\n }\n })\n .filter((f): f is ResumeField => f !== null)\n}\n\n/** The paused output shown to the approver: everything in `data` except form plumbing. */\nexport function outputOf(point: PausePoint | null | undefined): Record<string, unknown> {\n const data = point?.response?.data\n if (!data || typeof data !== 'object') return {}\n const { inputFormat: _f, resumeLinks: _l, ...rest } = data as Record<string, unknown>\n return rest\n}\n\n/** Formats a stored value for an input of this field's type. */\nexport function formatFieldValue(field: ResumeField, value: unknown): string {\n if (value === undefined || value === null) return ''\n switch (field.type) {\n case 'boolean':\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (typeof value === 'string' && ['true', 'false'].includes(value.trim().toLowerCase()))\n return value.trim().toLowerCase()\n return ''\n case 'number':\n return typeof value === 'number'\n ? Number.isFinite(value)\n ? String(value)\n : ''\n : String(value)\n case 'array':\n case 'object':\n case 'files':\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return ''\n }\n default:\n return typeof value === 'string' ? value : JSON.stringify(value)\n }\n}\n\n/** Parses an input's text back into the field's type; `error` names what went wrong. */\nexport function parseFieldValue(\n field: ResumeField,\n raw: string\n): { value?: unknown; error?: 'number' | 'json' } {\n const text = raw.trim()\n switch (field.type) {\n case 'boolean':\n return { value: text === 'true' }\n case 'number': {\n const n = Number(text)\n return Number.isFinite(n) ? { value: n } : { error: 'number' }\n }\n case 'array':\n case 'object':\n case 'files':\n try {\n return { value: JSON.parse(text) }\n } catch {\n return { error: 'json' }\n }\n default:\n return { value: raw }\n }\n}\n\n/** Initial input text per field, from the block's defaults. */\nexport function initialValues(fields: ResumeField[]): Record<string, string> {\n return Object.fromEntries(fields.map((f) => [f.name, formatFieldValue(f, f.value)]))\n}\n\n/**\n * Builds the submission from the inputs, or reports the fields that are missing or\n * malformed. Empty optional fields are left out of the submission.\n */\nexport function buildSubmission(\n fields: ResumeField[],\n values: Record<string, string>\n): { submission: Record<string, unknown>; errors: Record<string, 'required' | 'number' | 'json'> } {\n const submission: Record<string, unknown> = {}\n const errors: Record<string, 'required' | 'number' | 'json'> = {}\n for (const field of fields) {\n const raw = values[field.name] ?? ''\n const present = field.type === 'boolean' ? raw === 'true' || raw === 'false' : raw.trim() !== ''\n if (!present) {\n if (field.required) errors[field.name] = 'required'\n continue\n }\n const { value, error } = parseFieldValue(field, raw)\n if (error) errors[field.name] = error\n else if (value !== undefined) submission[field.name] = value\n }\n return { submission, errors }\n}\n","import { type FormEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { AginiesError } from '../client'\nimport { Button, cx, Eyebrow, Field, Input, Panel, Spinner, Tag, Textarea } from '../core'\nimport { useAginies, useModule } from '../provider'\nimport {\n buildSubmission,\n fieldsOf,\n getPausedExecution,\n initialValues,\n outputOf,\n type PausedExecution,\n type PausePoint,\n type ResumeField,\n type ResumeOutcome,\n resumeExecution,\n} from './approval-client'\n\nexport type ApprovalStatus =\n | 'loading'\n | 'ready'\n | 'submitting'\n | 'resumed'\n | 'queued'\n | 'not-found'\n | 'error'\n\n/**\n * State for one paused run: which pause point is selected, the approver's form, the\n * outcome of resuming. `ApprovalPanel` renders it; use the hook for a custom UI.\n */\nexport function useApproval(workflowId: string, executionId: string, contextId?: string) {\n const { client, t } = useAginies()\n const [status, setStatus] = useState<ApprovalStatus>('loading')\n const [execution, setExecution] = useState<PausedExecution | null>(null)\n const [selected, setSelected] = useState<string | null>(contextId ?? null)\n const [values, setValues] = useState<Record<string, string>>({})\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [error, setError] = useState<string | null>(null)\n const [outcome, setOutcome] = useState<ResumeOutcome | null>(null)\n const selectedRef = useRef<string | null>(contextId ?? null)\n\n const pausePoint: PausePoint | null = useMemo(() => {\n if (!execution) return null\n return (\n execution.pausePoints.find((p) => p.contextId === selected) ??\n execution.pausePoints.find((p) => p.resumeStatus === 'paused') ??\n execution.pausePoints[0] ??\n null\n )\n }, [execution, selected])\n\n const fields: ResumeField[] = useMemo(() => fieldsOf(pausePoint), [pausePoint])\n\n const load = useCallback(async () => {\n setStatus('loading')\n setError(null)\n try {\n const detail = await getPausedExecution(client, workflowId, executionId)\n setExecution(detail)\n const wanted = contextId ?? selectedRef.current\n const point =\n detail.pausePoints.find((p) => p.contextId === wanted) ??\n detail.pausePoints.find((p) => p.resumeStatus === 'paused') ??\n detail.pausePoints[0]\n if (point) {\n selectedRef.current = point.contextId\n setSelected(point.contextId)\n setValues(initialValues(fieldsOf(point)))\n }\n setErrors({})\n setStatus('ready')\n } catch (err) {\n if (err instanceof AginiesError && err.code === 'NOT_FOUND') setStatus('not-found')\n else {\n setError(err instanceof Error ? err.message : t('approval', 'loadError'))\n setStatus('error')\n }\n }\n }, [client, workflowId, executionId, contextId, t])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const select = useCallback(\n (nextContextId: string) => {\n selectedRef.current = nextContextId\n setSelected(nextContextId)\n const point = execution?.pausePoints.find((p) => p.contextId === nextContextId)\n setValues(initialValues(fieldsOf(point)))\n setErrors({})\n },\n [execution]\n )\n\n const setValue = useCallback((name: string, value: string) => {\n setValues((v) => ({ ...v, [name]: value }))\n setErrors((e) => {\n if (!(name in e)) return e\n const { [name]: _drop, ...rest } = e\n return rest\n })\n }, [])\n\n const submit = useCallback(async () => {\n if (!pausePoint || status === 'submitting') return\n const { submission, errors: problems } = buildSubmission(fields, values)\n if (Object.keys(problems).length > 0) {\n setErrors(\n Object.fromEntries(\n Object.entries(problems).map(([k, v]) => [\n k,\n v === 'required'\n ? t('approval', 'required')\n : v === 'number'\n ? t('approval', 'notANumber')\n : t('approval', 'notJson'),\n ])\n )\n )\n return\n }\n setStatus('submitting')\n setError(null)\n try {\n const result = await resumeExecution(\n client,\n workflowId,\n executionId,\n pausePoint.contextId,\n fields.length > 0 ? submission : null\n )\n setOutcome(result)\n setStatus(result.status === 'queued' ? 'queued' : 'resumed')\n } catch (err) {\n setError(err instanceof Error ? err.message : t('approval', 'resumeError'))\n setStatus('ready')\n }\n }, [client, workflowId, executionId, pausePoint, fields, values, status, t])\n\n return {\n status,\n execution,\n pausePoint,\n fields,\n values,\n errors,\n error,\n outcome,\n select,\n setValue,\n submit,\n reload: load,\n }\n}\n\n/* ───────────────────────────── component ───────────────────────────── */\n\nexport interface ApprovalPanelProps {\n /** Id of the agent (workflow) whose run is paused. */\n workflowId: string\n /** The paused execution, from the resume link the approver received. */\n executionId: string\n /** A specific pause point; defaults to the first one still paused. */\n contextId?: string\n title?: string\n description?: string\n /** Label of the resume button; defaults to \"Approve and continue\". */\n submitLabel?: string\n /** Called after the platform accepted the resume. */\n onResumed?: (outcome: ResumeOutcome) => void\n /** Hide the paused output block. */\n hideOutput?: boolean\n className?: string\n}\n\nconst STATUS_TONE: Record<string, 'default' | 'ok' | 'warn' | 'bad' | 'signal'> = {\n paused: 'warn',\n queued: 'signal',\n resuming: 'signal',\n resumed: 'ok',\n failed: 'bad',\n}\n\nexport function ApprovalPanel({\n workflowId,\n executionId,\n contextId,\n title,\n description,\n submitLabel,\n onResumed,\n hideOutput = false,\n className,\n}: ApprovalPanelProps) {\n const { t, locale } = useAginies()\n const enabled = useModule('approval')\n const a = useApproval(workflowId, executionId, contextId)\n const onResumedRef = useRef(onResumed)\n onResumedRef.current = onResumed\n\n useEffect(() => {\n if ((a.status === 'resumed' || a.status === 'queued') && a.outcome) {\n onResumedRef.current?.(a.outcome)\n }\n }, [a.status, a.outcome])\n\n if (!enabled) return null\n\n const point = a.pausePoint\n const output = hideOutput ? {} : outputOf(point)\n const outputEntries = Object.entries(output)\n const canSubmit = point?.resumeStatus === 'paused' && a.status === 'ready'\n const fmt = (iso: string | null | undefined) =>\n iso ? new Date(iso).toLocaleString(locale === 'tr' ? 'tr-TR' : 'en-GB') : ''\n\n const onSubmit = (e: FormEvent) => {\n e.preventDefault()\n void a.submit()\n }\n\n return (\n <Panel className={cx('agi-approval', className)} aria-busy={a.status === 'loading'}>\n <header className='agi-approval__head'>\n <Eyebrow>{t('approval', 'eyebrow')}</Eyebrow>\n <h3 className='agi-approval__title'>{title ?? t('approval', 'title')}</h3>\n {description && <p className='agi-approval__desc'>{description}</p>}\n {a.execution && (\n <p className='agi-approval__meta'>\n {t('approval', 'execution')}{' '}\n <span className='agi-approval__meta-value'>{a.execution.executionId.slice(0, 8)}</span>\n {a.execution.pausedAt && (\n <>\n {' · '}\n {t('approval', 'pausedAt')} {fmt(a.execution.pausedAt)}\n </>\n )}\n </p>\n )}\n </header>\n\n {a.status === 'loading' && (\n <div className='agi-approval__state'>\n <Spinner label={t('common', 'loading')} /> {t('common', 'loading')}\n </div>\n )}\n\n {a.status === 'not-found' && (\n <div className='agi-approval__state'>\n <p>{t('approval', 'notFound')}</p>\n </div>\n )}\n\n {a.status === 'error' && (\n <div className='agi-approval__state'>\n <p className='agi-approval__error'>{a.error}</p>\n <Button variant='outline' size='sm' onClick={() => void a.reload()}>\n {t('common', 'retry')}\n </Button>\n </div>\n )}\n\n {a.execution && a.execution.pausePoints.length > 1 && (\n <nav className='agi-approval__points' aria-label={t('approval', 'points')}>\n {a.execution.pausePoints.map((p, i) => (\n <button\n type='button'\n key={p.contextId}\n className={cx(\n 'agi-approval__point',\n p.contextId === point?.contextId && 'is-selected'\n )}\n onClick={() => a.select(p.contextId)}\n >\n <span>\n {t('approval', 'point')} {i + 1}\n </span>\n <Tag tone={STATUS_TONE[p.resumeStatus] ?? 'default'}>\n {t('approval', p.resumeStatus)}\n </Tag>\n </button>\n ))}\n </nav>\n )}\n\n {point && a.status !== 'loading' && (\n <>\n <div className='agi-approval__status'>\n <Tag tone={STATUS_TONE[point.resumeStatus] ?? 'default'}>\n {t('approval', point.resumeStatus)}\n </Tag>\n {typeof point.queuePosition === 'number' && point.queuePosition > 0 && (\n <span className='agi-approval__queue'>\n {t('approval', 'queuePosition')} {point.queuePosition}\n </span>\n )}\n </div>\n\n {outputEntries.length > 0 && (\n <section className='agi-approval__output' aria-label={t('approval', 'output')}>\n <div className='agi-approval__output-label'>{t('approval', 'output')}</div>\n <dl className='agi-approval__kv'>\n {outputEntries.map(([k, v]) => (\n <div key={k} className='agi-approval__kv-row'>\n <dt>{k}</dt>\n <dd>{typeof v === 'string' ? v : JSON.stringify(v, null, 2)}</dd>\n </div>\n ))}\n </dl>\n </section>\n )}\n\n {(a.status === 'resumed' || a.status === 'queued') && a.outcome ? (\n <output className='agi-approval__done'>\n <Tag tone={a.status === 'queued' ? 'signal' : 'ok'}>\n {t('approval', a.status === 'queued' ? 'queued' : 'resumed')}\n </Tag>\n <p>\n {a.status === 'queued'\n ? t('approval', 'queuedMessage')\n : t('approval', 'resumedMessage')}\n </p>\n </output>\n ) : (\n <form className='agi-approval__form' onSubmit={onSubmit}>\n {a.fields.map((f) => (\n <Field key={f.id} label={f.label} hint={f.description} error={a.errors[f.name]}>\n {renderField(f, a.values[f.name] ?? '', (v) => a.setValue(f.name, v), !canSubmit)}\n </Field>\n ))}\n {a.error && <p className='agi-approval__error'>{a.error}</p>}\n <div className='agi-approval__actions'>\n <Button variant='signal' type='submit' disabled={!canSubmit}>\n {a.status === 'submitting' ? (\n <>\n <Spinner label={t('approval', 'submitting')} /> {t('approval', 'submitting')}\n </>\n ) : (\n (submitLabel ?? t('approval', 'submit'))\n )}\n </Button>\n <Button\n variant='outline'\n type='button'\n onClick={() => void a.reload()}\n disabled={a.status === 'submitting'}\n >\n {t('approval', 'refresh')}\n </Button>\n </div>\n </form>\n )}\n </>\n )}\n </Panel>\n )\n}\n\nfunction renderField(f: ResumeField, value: string, set: (v: string) => void, disabled: boolean) {\n switch (f.type) {\n case 'boolean':\n return (\n <select\n className='agi-input'\n value={value}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n >\n <option value=''>—</option>\n <option value='true'>true</option>\n <option value='false'>false</option>\n </select>\n )\n case 'number':\n return (\n <Input\n type='number'\n value={value}\n placeholder={f.placeholder}\n required={f.required}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n />\n )\n case 'array':\n case 'object':\n case 'files':\n return (\n <Textarea\n value={value}\n rows={f.rows ?? 4}\n placeholder={f.placeholder ?? '{ }'}\n required={f.required}\n disabled={disabled}\n className='agi-approval__json'\n onChange={(e) => set(e.target.value)}\n />\n )\n default:\n if (Array.isArray(f.options) && f.options.length > 0) {\n return (\n <select\n className='agi-input'\n value={value}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n >\n <option value=''>—</option>\n {f.options.map((o) => {\n const opt =\n typeof o === 'object' && o !== null\n ? (o as { value?: unknown; label?: unknown })\n : { value: o, label: o }\n const v = String(opt.value ?? '')\n return (\n <option key={v} value={v}>\n {String(opt.label ?? v)}\n </option>\n )\n })}\n </select>\n )\n }\n if ((f.rows ?? 1) > 1) {\n return (\n <Textarea\n value={value}\n rows={f.rows}\n placeholder={f.placeholder}\n required={f.required}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n />\n )\n }\n return (\n <Input\n value={value}\n placeholder={f.placeholder}\n required={f.required}\n disabled={disabled}\n onChange={(e) => set(e.target.value)}\n />\n )\n }\n}\n","import type {\n ButtonHTMLAttributes,\n HTMLAttributes,\n InputHTMLAttributes,\n TextareaHTMLAttributes,\n} from 'react'\nimport { forwardRef } from 'react'\n\n/** Joins class names, dropping falsy entries. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ')\n}\n\n/* ───────────────────────────── Button ───────────────────────────── */\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** `primary` is the text fill, `signal` the accent fill, `outline` the quiet default. */\n variant?: 'primary' | 'signal' | 'outline' | 'ghost' | 'destructive'\n size?: 'sm' | 'md' | 'lg'\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { variant = 'outline', size = 'md', className, type = 'button', ...props },\n ref\n) {\n return (\n <button\n ref={ref}\n type={type}\n className={cx('agi-btn', `agi-btn--${variant}`, `agi-btn--${size}`, className)}\n {...props}\n />\n )\n})\n\n/* ───────────────────────────── Tag / Chip ───────────────────────────── */\n\nexport interface TagProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: 'default' | 'signal' | 'ok' | 'warn' | 'bad'\n}\n\nexport function Tag({ tone = 'default', className, ...props }: TagProps) {\n return (\n <span\n className={cx('agi-tag', tone !== 'default' && `agi-tag--${tone}`, className)}\n {...props}\n />\n )\n}\n\nexport interface ChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n pressed?: boolean\n}\n\nexport function Chip({ pressed = false, className, type = 'button', ...props }: ChipProps) {\n return (\n <button type={type} aria-pressed={pressed} className={cx('agi-chip', className)} {...props} />\n )\n}\n\n/* ───────────────────────────── Surfaces ───────────────────────────── */\n\nexport interface PanelProps extends HTMLAttributes<HTMLDivElement> {\n level?: 1 | 2\n}\n\nexport function Panel({ level = 1, className, ...props }: PanelProps) {\n return <div className={cx('agi-panel', level === 2 && 'agi-panel--2', className)} {...props} />\n}\n\n/* ───────────────────────────── Type ───────────────────────────── */\n\nexport function Eyebrow({\n className,\n quiet,\n ...props\n}: HTMLAttributes<HTMLParagraphElement> & { quiet?: boolean }) {\n return <p className={cx('agi-eyebrow', quiet && 'agi-eyebrow--quiet', className)} {...props} />\n}\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n value: string\n label: string\n}\n\nexport function Stat({ value, label, className, ...props }: StatProps) {\n return (\n <div className={cx('agi-stat', className)} {...props}>\n <div className='agi-stat__v'>{value}</div>\n <div className='agi-stat__k'>{label}</div>\n </div>\n )\n}\n\n/* ───────────────────────────── Fields ───────────────────────────── */\n\nexport interface FieldProps extends HTMLAttributes<HTMLLabelElement> {\n label: string\n htmlFor?: string\n /** Help text under the control; replaced by `error` when one is set. */\n hint?: string\n error?: string\n}\n\nexport function Field({ label, hint, error, className, children, ...props }: FieldProps) {\n return (\n // biome-ignore lint/a11y/noLabelWithoutControl: the control is passed as children\n <label className={cx('agi-field', className)} {...props}>\n <span className='agi-field__label'>{label}</span>\n {children}\n {error ? (\n <span className='agi-field__error'>{error}</span>\n ) : (\n hint && <span className='agi-field__hint'>{hint}</span>\n )}\n </label>\n )\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(\n function Input({ className, ...props }, ref) {\n return <input ref={ref} className={cx('agi-input', className)} {...props} />\n }\n)\n\nexport const Textarea = forwardRef<\n HTMLTextAreaElement,\n TextareaHTMLAttributes<HTMLTextAreaElement>\n>(function Textarea({ className, ...props }, ref) {\n return <textarea ref={ref} className={cx('agi-input', 'agi-textarea', className)} {...props} />\n})\n\n/* ───────────────────────────── Feedback ───────────────────────────── */\n\nexport function Spinner({ className, label }: { className?: string; label?: string }) {\n return (\n <output className={cx('agi-spinner', className)} aria-label={label}>\n <span />\n <span />\n <span />\n </output>\n )\n}\n","import { createContext, type ReactNode, useContext, useEffect, useMemo, useState } from 'react'\nimport { type ActivationState, AginiesClient, type AginiesConfig } from './client'\nimport { type Locale, type Translator, translator } from './i18n'\n\nlet defaultClient: AginiesClient | null = null\n\n/**\n * Creates the shared client and starts the activation handshake. Call it once, before\n * rendering any widget; `AginiesProvider` picks the client up automatically.\n */\nexport function init(config: AginiesConfig): AginiesClient {\n defaultClient = new AginiesClient(config)\n void defaultClient.activate()\n return defaultClient\n}\n\n/** The client created by `init()`, if any. */\nexport function getClient(): AginiesClient | null {\n return defaultClient\n}\n\nexport interface AginiesContextValue {\n client: AginiesClient\n state: ActivationState\n locale: Locale\n t: Translator\n}\n\nconst AginiesContext = createContext<AginiesContextValue | null>(null)\n\n/**\n * Whether the activation unlocks `module` (`chat`, `run`, `observability`, `approval`).\n * A widget whose module is locked renders nothing and warns once.\n */\nexport function useModule(module: string): boolean {\n const { client } = useAginies()\n const allowed = client.hasModule(module)\n useEffect(() => {\n if (!allowed && typeof console !== 'undefined') {\n console.warn(`[aginies] the \"${module}\" module is not enabled for this activation key`)\n }\n }, [allowed, module])\n return allowed\n}\n\nexport interface AginiesProviderProps {\n /** A client from `init()` or `new AginiesClient()`. Defaults to the one `init()` made. */\n client?: AginiesClient\n /** Override the client's locale for this subtree. */\n locale?: Locale\n /** Rendered while the activation handshake runs. Defaults to nothing. */\n fallback?: ReactNode\n children: ReactNode\n}\n\n/**\n * Provides the activated client to every widget below it. Children render only once the\n * activation succeeds; a rejected activation renders nothing and logs one warning, so a\n * page with a wrong or missing token degrades to plain content.\n */\nexport function AginiesProvider({\n client,\n locale,\n fallback = null,\n children,\n}: AginiesProviderProps) {\n const resolved = client ?? defaultClient\n const [state, setState] = useState<ActivationState>(\n resolved?.getState() ?? { status: 'rejected', reason: 'init() was not called' }\n )\n\n useEffect(() => {\n if (!resolved) return\n setState(resolved.getState())\n const unsubscribe = resolved.subscribe(setState)\n void resolved.activate()\n return unsubscribe\n }, [resolved])\n\n useEffect(() => {\n if (state.status === 'rejected' && typeof console !== 'undefined') {\n console.warn(`[aginies] UI kit not activated: ${state.reason}`)\n }\n }, [state])\n\n const value = useMemo<AginiesContextValue | null>(() => {\n if (!resolved) return null\n const l = locale ?? resolved.locale\n return { client: resolved, state, locale: l, t: translator(l) }\n }, [resolved, state, locale])\n\n if (!value) return null\n if (state.status === 'idle' || state.status === 'activating') return <>{fallback}</>\n if (state.status === 'rejected') return null\n return <AginiesContext.Provider value={value}>{children}</AginiesContext.Provider>\n}\n\n/** Access to the activated client, its configuration and the translator. */\nexport function useAginies(): AginiesContextValue {\n const ctx = useContext(AginiesContext)\n if (!ctx) {\n throw new Error('[aginies] useAginies must be used inside <AginiesProvider> after init()')\n }\n return ctx\n}\n","export type Locale = 'tr' | 'en'\n\nconst STRINGS = {\n chat: {\n open: { tr: 'Sohbeti aç', en: 'Open chat' },\n close: { tr: 'Kapat', en: 'Close' },\n placeholder: { tr: 'Mesajınızı yazın…', en: 'Type your message…' },\n send: { tr: 'Gönder', en: 'Send' },\n stop: { tr: 'Durdur', en: 'Stop' },\n attach: { tr: 'Dosya ekle', en: 'Attach file' },\n attachments: { tr: 'Ekler', en: 'Attachments' },\n removeFile: { tr: 'Dosyayı kaldır', en: 'Remove file' },\n tooManyFiles: { tr: 'En fazla 5 dosya ekleyebilirsiniz.', en: 'You can attach up to 5 files.' },\n fileTooLarge: {\n tr: \"Dosyalar 10 MB'tan küçük olmalı.\",\n en: 'Files must be smaller than 10 MB.',\n },\n welcome: {\n tr: 'Merhaba! Size nasıl yardımcı olabilirim?',\n en: 'Hi there! How can I help you today?',\n },\n thinking: { tr: 'Yanıt hazırlanıyor', en: 'Working on it' },\n stopped: { tr: 'Yanıt durduruldu.', en: 'Response stopped.' },\n error: {\n tr: 'Bir sorun oluştu. Lütfen tekrar deneyin.',\n en: 'Something went wrong. Please try again.',\n },\n unavailable: {\n tr: 'Bu sohbet şu anda kullanılamıyor.',\n en: 'This chat is currently unavailable.',\n },\n poweredBy: { tr: 'Aginies ile', en: 'Powered by Aginies' },\n you: { tr: 'Siz', en: 'You' },\n assistant: { tr: 'Ajan', en: 'Agent' },\n },\n auth: {\n passwordTitle: { tr: 'Bu sohbet parola korumalı', en: 'This chat is password protected' },\n passwordHint: { tr: 'Devam etmek için parolayı girin.', en: 'Enter the password to continue.' },\n password: { tr: 'Parola', en: 'Password' },\n emailTitle: { tr: 'E-posta ile doğrulama', en: 'Verify with your e-mail' },\n emailHint: {\n tr: 'İş e-postanızı girin; size bir kod göndereceğiz.',\n en: 'Enter your work e-mail; we will send you a code.',\n },\n email: { tr: 'E-posta', en: 'E-mail' },\n code: { tr: 'Doğrulama kodu', en: 'Verification code' },\n codeHint: {\n tr: 'E-postanıza gelen 6 haneli kodu girin.',\n en: 'Enter the 6-digit code from your e-mail.',\n },\n continue: { tr: 'Devam et', en: 'Continue' },\n sendCode: { tr: 'Kod gönder', en: 'Send code' },\n verify: { tr: 'Doğrula', en: 'Verify' },\n back: { tr: 'Geri', en: 'Back' },\n invalidPassword: { tr: 'Parola yanlış.', en: 'Wrong password.' },\n invalidEmail: {\n tr: 'Bu e-posta adresi yetkili değil.',\n en: 'This e-mail address is not allowed.',\n },\n invalidCode: {\n tr: 'Kod geçersiz veya süresi dolmuş.',\n en: 'The code is invalid or has expired.',\n },\n codeSent: { tr: 'Kod gönderildi.', en: 'Code sent.' },\n codeError: {\n tr: 'Kod gönderilemedi. Lütfen tekrar deneyin.',\n en: 'The code could not be sent. Please try again.',\n },\n resend: { tr: 'Kodu yeniden gönder', en: 'Resend code' },\n ssoTitle: { tr: 'Kurumsal giriş gerekli', en: 'Sign in with your organisation' },\n ssoHint: {\n tr: 'Bu sohbet kurumsal kimlikle açılır.',\n en: 'This chat opens with your organisation account.',\n },\n ssoButton: { tr: 'Kurumsal giriş', en: 'Sign in' },\n },\n voice: {\n talk: { tr: 'Konuşmak için dokunun', en: 'Tap to talk' },\n stopTalking: { tr: 'Bitirmek için dokunun', en: 'Tap when done' },\n dictate: { tr: 'Sesle yaz', en: 'Dictate' },\n handsFree: { tr: 'Sesli sohbet', en: 'Voice conversation' },\n exit: { tr: 'Sesli sohbetten çık', en: 'Leave voice conversation' },\n listening: { tr: 'Dinliyor', en: 'Listening' },\n transcribing: { tr: 'Yazıya dökülüyor', en: 'Transcribing' },\n thinking: { tr: 'Yanıt hazırlanıyor', en: 'Working on it' },\n speaking: { tr: 'Konuşuyor', en: 'Speaking' },\n idle: { tr: 'Hazır', en: 'Ready' },\n interrupt: { tr: 'Sözünü kesmek için dokunun', en: 'Tap to interrupt' },\n micDenied: {\n tr: 'Mikrofon izni verilmedi. Tarayıcı ayarlarından izin verin.',\n en: 'Microphone access was denied. Allow it in your browser settings.',\n },\n unsupported: {\n tr: 'Bu tarayıcı ses kaydını desteklemiyor.',\n en: 'This browser cannot record audio.',\n },\n unavailable: {\n tr: 'Ses özelliği bu sohbet için açık değil.',\n en: 'Voice is not enabled for this chat.',\n },\n error: {\n tr: 'Ses işlenemedi. Lütfen tekrar deneyin.',\n en: 'Voice could not be processed. Please try again.',\n },\n },\n run: {\n submit: { tr: 'Çalıştır', en: 'Run' },\n cancel: { tr: 'İptal', en: 'Cancel' },\n running: { tr: 'Çalışıyor', en: 'Running' },\n done: { tr: 'Tamamlandı', en: 'Completed' },\n error: { tr: 'Hata', en: 'Error' },\n failed: { tr: 'Çalıştırma başarısız oldu.', en: 'The run failed.' },\n unauthorized: { tr: 'API anahtarı reddedildi.', en: 'The API key was rejected.' },\n steps: { tr: 'Adımlar', en: 'Steps' },\n execution: { tr: 'çalıştırma', en: 'execution' },\n },\n approval: {\n eyebrow: { tr: 'İnsan onayı', en: 'Human approval' },\n title: { tr: 'Onay bekleyen adım', en: 'A step is waiting for approval' },\n execution: { tr: 'çalıştırma', en: 'execution' },\n pausedAt: { tr: 'duraklatıldı', en: 'paused' },\n points: { tr: 'Onay noktaları', en: 'Approval points' },\n point: { tr: 'Nokta', en: 'Point' },\n output: { tr: 'Ajanın önerisi', en: 'What the agent proposes' },\n queuePosition: { tr: 'Sıra', en: 'Queue position' },\n submit: { tr: 'Onayla ve devam et', en: 'Approve and continue' },\n submitting: { tr: 'Gönderiliyor', en: 'Submitting' },\n refresh: { tr: 'Yenile', en: 'Refresh' },\n required: { tr: 'Bu alan zorunlu.', en: 'This field is required.' },\n notANumber: { tr: 'Sayı girin.', en: 'Enter a number.' },\n notJson: { tr: 'Geçerli JSON girin.', en: 'Enter valid JSON.' },\n notFound: {\n tr: 'Bu onay bulunamadı; süresi dolmuş veya tamamlanmış olabilir.',\n en: 'This approval could not be found; it may have expired or been completed.',\n },\n loadError: { tr: 'Onay yüklenemedi.', en: 'The approval could not be loaded.' },\n resumeError: { tr: 'Devam ettirilemedi.', en: 'The run could not be resumed.' },\n resumedMessage: {\n tr: 'Ajan kaldığı yerden devam ediyor.',\n en: 'The agent is continuing from where it paused.',\n },\n queuedMessage: {\n tr: 'Onay sıraya alındı; önceki devam işlemleri bitince çalışacak.',\n en: 'The approval is queued; it runs after the earlier resumes finish.',\n },\n paused: { tr: 'Onay bekliyor', en: 'Awaiting approval' },\n queued: { tr: 'Sırada', en: 'Queued' },\n resuming: { tr: 'Devam ediyor', en: 'Resuming' },\n resumed: { tr: 'Devam etti', en: 'Resumed' },\n failed: { tr: 'Başarısız', en: 'Failed' },\n },\n common: {\n loading: { tr: 'Yükleniyor', en: 'Loading' },\n retry: { tr: 'Tekrar dene', en: 'Retry' },\n notActivated: {\n tr: 'Aginies UI paketi etkinleştirilmedi.',\n en: 'The Aginies UI package is not activated.',\n },\n },\n} as const\n\ntype Section = keyof typeof STRINGS\ntype Key<S extends Section> = keyof (typeof STRINGS)[S]\n\n/** Returns a translator bound to a locale: `t('chat', 'send')`. */\nexport function translator(locale: Locale) {\n return function t<S extends Section>(section: S, key: Key<S>): string {\n const entry = STRINGS[section][key] as { tr: string; en: string }\n return entry[locale] ?? entry.en\n }\n}\n\nexport type Translator = ReturnType<typeof translator>\n","import { type ChangeEvent, type FormEvent, useCallback, useEffect, useRef, useState } from 'react'\nimport { AginiesError, type ChatConfig, type ChatFilePayload } from '../client'\nimport { Button, cx, Field, Input, Spinner } from '../core'\nimport { useAginies, useModule } from '../provider'\nimport { Markdown } from './markdown'\nimport { parseStructured, type StructuredResponse, StructuredUI } from './structured-ui'\nimport { useVoice, type VoiceControls } from './voice'\n\n/** A file the visitor attached to a message, as shown in the transcript. */\nexport interface ChatAttachment {\n name: string\n type: string\n size: number\n}\n\nexport interface ChatMessage {\n id: string\n role: 'user' | 'assistant'\n content: string\n attachments?: ChatAttachment[]\n structured?: StructuredResponse | null\n streaming?: boolean\n error?: boolean\n}\n\n/** Outcome of asking the platform to e-mail a verification code. */\nexport type CodeRequestResult = 'sent' | 'unauthorized' | 'error'\n\n/** Per-file and per-message limits for attachments; the platform rejects larger uploads. */\nexport const ATTACHMENT_LIMITS = { maxFiles: 5, maxBytes: 10 * 1024 * 1024 } as const\n\ntype AuthNeed = 'password' | 'email' | 'sso' | null\n\n/**\n * Chat state for one hosted-chat deployment: configuration, authentication, messages and\n * the streaming turn in flight. `ChatWidget` renders it; use the hook directly for a custom UI.\n */\nexport function useChat(identifier: string, enabled = true) {\n const { client, t } = useAginies()\n const [config, setConfig] = useState<ChatConfig | null>(null)\n const [authNeed, setAuthNeed] = useState<AuthNeed>(null)\n const [authTitle, setAuthTitle] = useState<string | undefined>()\n const [loadError, setLoadError] = useState<string | null>(null)\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [busy, setBusy] = useState(false)\n const [conversationId] = useState(() => randomId())\n const abortRef = useRef<AbortController | null>(null)\n\n const load = useCallback(async () => {\n setLoadError(null)\n try {\n const res = await client.getChat(identifier)\n if ('authRequired' in res) {\n setAuthNeed(res.authRequired === 'public' ? null : res.authRequired)\n setAuthTitle(res.title)\n return\n }\n setConfig(res)\n setAuthNeed(null)\n } catch (err) {\n setLoadError(\n err instanceof AginiesError && err.status === 403\n ? t('chat', 'unavailable')\n : t('chat', 'error')\n )\n }\n }, [client, identifier, t])\n\n useEffect(() => {\n if (enabled) void load()\n }, [load, enabled])\n\n const chatPath = `/api/chat/${encodeURIComponent(identifier)}`\n\n /** Sends the password as a first turn; the platform sets its cookie and returns the config. */\n const authenticate = useCallback(\n async ({ password }: { password: string }) => {\n const res = await client.fetchRaw(chatPath, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ password, conversationId }),\n })\n if (res.ok) {\n await load()\n return true\n }\n return false\n },\n [client, chatPath, conversationId, load]\n )\n\n /** Asks the platform to e-mail a one-time code to an address on the chat's allow-list. */\n const requestCode = useCallback(\n async (email: string): Promise<CodeRequestResult> => {\n const res = await client.fetchRaw(`${chatPath}/otp`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email }),\n })\n if (res.ok) return 'sent'\n return res.status === 403 ? 'unauthorized' : 'error'\n },\n [client, chatPath]\n )\n\n /** Verifies the e-mailed code; on success the platform sets its cookie and the chat loads. */\n const verifyCode = useCallback(\n async (email: string, otp: string) => {\n const res = await client.fetchRaw(`${chatPath}/otp`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, otp }),\n })\n if (res.ok) {\n await load()\n return true\n }\n return false\n },\n [client, chatPath, load]\n )\n\n const stop = useCallback(() => {\n abortRef.current?.abort()\n abortRef.current = null\n setBusy(false)\n setMessages((prev) => {\n const last = prev[prev.length - 1]\n if (!last || last.role !== 'assistant' || !last.streaming) return prev\n return [\n ...prev.slice(0, -1),\n { ...last, streaming: false, content: last.content || t('chat', 'stopped') },\n ]\n })\n }, [t])\n\n const send = useCallback(\n async (text: string, files: ChatFilePayload[] = []) => {\n const input = text.trim()\n if ((!input && files.length === 0) || busy) return\n const userMessage: ChatMessage = {\n id: randomId(),\n role: 'user',\n content: input,\n attachments: files.map(({ name, type, size }) => ({ name, type, size })),\n }\n const assistantId = randomId()\n setMessages((prev) => [\n ...prev,\n userMessage,\n { id: assistantId, role: 'assistant', content: '', streaming: true },\n ])\n setBusy(true)\n const controller = new AbortController()\n abortRef.current = controller\n let content = ''\n const update = (patch: Partial<ChatMessage>) =>\n setMessages((prev) => prev.map((m) => (m.id === assistantId ? { ...m, ...patch } : m)))\n try {\n for await (const ev of client.sendMessage(\n identifier,\n { input, conversationId, files },\n controller.signal\n )) {\n if (ev.type === 'chunk') {\n content += ev.text\n update({ content })\n } else if (ev.type === 'final') {\n const text = extractFinalText(ev.data)\n if (text && !content) {\n content = text\n update({ content })\n }\n } else if (ev.type === 'error') {\n update({ content: ev.message, error: true, streaming: false })\n }\n }\n update({ streaming: false, structured: parseStructured(content) })\n } catch (err) {\n if (controller.signal.aborted) return\n const message =\n err instanceof AginiesError && err.code === 'AUTH_REQUIRED'\n ? t('chat', 'unavailable')\n : t('chat', 'error')\n update({ content: message, error: true, streaming: false })\n if (err instanceof AginiesError && err.code === 'AUTH_REQUIRED') void load()\n } finally {\n abortRef.current = null\n setBusy(false)\n }\n },\n [busy, client, identifier, conversationId, t, load]\n )\n\n return {\n config,\n authNeed,\n authTitle,\n loadError,\n messages,\n busy,\n send,\n stop,\n authenticate,\n requestCode,\n verifyCode,\n reload: load,\n }\n}\n\nfunction extractFinalText(data: unknown): string | null {\n if (!data || typeof data !== 'object') return null\n const d = data as { output?: Record<string, Record<string, unknown>> }\n if (!d.output) return null\n for (const block of Object.values(d.output)) {\n if (block && typeof block === 'object') {\n const b = block as Record<string, unknown>\n if (typeof b.content === 'string') return b.content\n if (typeof b.result === 'string') return b.result\n }\n }\n return null\n}\n\nfunction randomId(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) return crypto.randomUUID()\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`\n}\n\n/* ───────────────────────────── widget ───────────────────────────── */\n\nexport interface ChatWidgetProps {\n /** Identifier of the deployed chat, the last segment of its hosted URL. */\n identifier: string\n /** `bubble` floats a launcher in a corner; `inline` fills its container; `full` fills the viewport. */\n mode?: 'bubble' | 'inline' | 'full'\n /** Corner for `bubble` mode. */\n position?: 'right' | 'left'\n /** Text on the launcher; defaults to the chat title. */\n launcherLabel?: string\n /** Start open (bubble mode). */\n defaultOpen?: boolean\n /** Theme for the widget subtree; `auto` follows the host page. */\n theme?: 'dark' | 'light' | 'auto'\n /**\n * Offer dictation and a hands-free voice conversation when the platform provides speech\n * for this chat and the browser can record. Default true.\n */\n voice?: boolean\n className?: string\n}\n\n/** Voice controls the composer shows: dictation into the draft and a hands-free mode. */\ninterface ComposerVoice {\n state: VoiceControls['state']\n error: string | null\n start: () => Promise<void>\n stop: () => void\n onHandsFree: () => void\n}\n\ninterface Dictation {\n id: number\n text: string\n}\n\nexport function ChatWidget({\n identifier,\n mode = 'inline',\n position = 'right',\n launcherLabel,\n defaultOpen = false,\n theme = 'auto',\n voice = true,\n className,\n}: ChatWidgetProps) {\n const [open, setOpen] = useState(defaultOpen || mode !== 'bubble')\n const { t } = useAginies()\n const enabled = useModule('chat')\n const chat = useChat(identifier, enabled)\n const [voiceMode, setVoiceMode] = useState(false)\n const [dictation, setDictation] = useState<Dictation | null>(null)\n const voiceModeRef = useRef(voiceMode)\n voiceModeRef.current = voiceMode\n const sendRef = useRef(chat.send)\n sendRef.current = chat.send\n const voiceControls = useVoice({\n identifier,\n onTranscript: (text) => {\n if (voiceModeRef.current) void sendRef.current(text)\n else setDictation({ id: Date.now(), text })\n },\n })\n const capabilities = chat.config?.voice\n const voiceAvailable = voice && voiceControls.supported && capabilities?.stt === true\n const title = chat.config?.title ?? chat.authTitle ?? launcherLabel ?? 'Aginies'\n const themeClass = theme === 'auto' ? undefined : theme === 'dark' ? 'dark' : 'light'\n if (!enabled) return null\n\n const leaveVoiceMode = () => {\n voiceControls.cancelListening()\n voiceControls.stopSpeaking()\n setVoiceMode(false)\n }\n\n const panel = (\n <section\n className={cx('agi-chat', `agi-chat--${mode}`, themeClass, className)}\n data-theme={themeClass}\n aria-label={title}\n >\n <header className='agi-chat__head'>\n <div className='agi-chat__title'>\n {chat.config?.customizations.imageUrl && (\n <img src={chat.config.customizations.imageUrl} alt='' />\n )}\n <div>\n <div className='agi-chat__name'>{title}</div>\n {chat.config?.description && (\n <div className='agi-chat__desc'>{chat.config.description}</div>\n )}\n </div>\n </div>\n {mode === 'bubble' && (\n <button\n type='button'\n className='agi-chat__close'\n onClick={() => setOpen(false)}\n aria-label={t('chat', 'close')}\n >\n ×\n </button>\n )}\n </header>\n\n {chat.loadError ? (\n <div className='agi-chat__state'>\n <p>{chat.loadError}</p>\n <Button variant='outline' size='sm' onClick={() => void chat.reload()}>\n {t('common', 'retry')}\n </Button>\n </div>\n ) : chat.authNeed ? (\n <ChatAuth\n need={chat.authNeed}\n onPassword={chat.authenticate}\n onRequestCode={chat.requestCode}\n onVerifyCode={chat.verifyCode}\n />\n ) : !chat.config ? (\n <div className='agi-chat__state'>\n <Spinner label={t('common', 'loading')} />\n </div>\n ) : voiceMode ? (\n <VoiceConversation\n messages={chat.messages}\n busy={chat.busy}\n voice={voiceControls}\n speakReplies={capabilities?.tts === true}\n onExit={leaveVoiceMode}\n />\n ) : (\n <>\n <MessageList\n messages={chat.messages}\n welcome={chat.config.customizations.welcomeMessage || t('chat', 'welcome')}\n onAction={(action) => void chat.send(action)}\n />\n <Composer\n busy={chat.busy}\n onSend={chat.send}\n onStop={chat.stop}\n dictation={dictation}\n voice={\n voiceAvailable\n ? {\n state: voiceControls.state,\n error: voiceControls.error,\n start: voiceControls.startListening,\n stop: voiceControls.stopListening,\n onHandsFree: () => setVoiceMode(true),\n }\n : undefined\n }\n />\n </>\n )}\n <footer className='agi-chat__foot'>\n <a href='https://www.aginies.com' target='_blank' rel='noreferrer'>\n {t('chat', 'poweredBy')}\n </a>\n </footer>\n </section>\n )\n\n if (mode !== 'bubble') return panel\n\n return (\n <div\n className={cx('agi-bubble', `agi-bubble--${position}`, themeClass)}\n data-theme={themeClass}\n >\n {open && panel}\n <button\n type='button'\n className={cx('agi-bubble__launcher', open && 'agi-bubble__launcher--open')}\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n aria-label={open ? t('chat', 'close') : t('chat', 'open')}\n >\n <svg\n width='22'\n height='22'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='1.7'\n strokeLinecap='round'\n strokeLinejoin='round'\n aria-hidden='true'\n >\n <path d='M4 5.5A2.5 2.5 0 0 1 6.5 3h11A2.5 2.5 0 0 1 20 5.5v8a2.5 2.5 0 0 1-2.5 2.5H10l-5 4v-4H6.5A2.5 2.5 0 0 1 4 13.5v-8z' />\n <path d='M8 8h8M8 11.5h5' />\n </svg>\n {!open && <span>{launcherLabel ?? title}</span>}\n </button>\n </div>\n )\n}\n\n/* ───────────────────────────── parts ───────────────────────────── */\n\nfunction MessageList({\n messages,\n welcome,\n onAction,\n}: {\n messages: ChatMessage[]\n welcome: string\n onAction: (action: string) => void\n}) {\n const { t } = useAginies()\n const endRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n endRef.current?.scrollIntoView?.({ block: 'end' })\n }, [])\n return (\n <div className='agi-chat__messages' role='log' aria-live='polite'>\n <div className='agi-msg agi-msg--assistant'>\n <span className='agi-msg__who'>{t('chat', 'assistant')}</span>\n <div className='agi-msg__body'>{welcome}</div>\n </div>\n {messages.map((m) => (\n <div\n key={m.id}\n className={cx('agi-msg', `agi-msg--${m.role}`, m.error && 'agi-msg--error')}\n >\n <span className='agi-msg__who'>\n {m.role === 'user' ? t('chat', 'you') : t('chat', 'assistant')}\n </span>\n <div className='agi-msg__body'>\n {m.structured ? (\n <StructuredUI response={m.structured} onAction={onAction} />\n ) : m.content ? (\n m.role === 'assistant' && !m.error ? (\n <Markdown className='agi-md' text={m.content} />\n ) : (\n <p>{m.content}</p>\n )\n ) : m.streaming ? (\n <span className='agi-msg__thinking'>\n <Spinner label={t('chat', 'thinking')} /> {t('chat', 'thinking')}\n </span>\n ) : null}\n {m.attachments && m.attachments.length > 0 && (\n <ul className='agi-msg__files' aria-label={t('chat', 'attachments')}>\n {m.attachments.map((file, n) => (\n <li key={n} className='agi-file'>\n <FileGlyph />\n <span className='agi-file__name'>{file.name}</span>\n <span className='agi-file__size'>{formatBytes(file.size)}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n ))}\n <div ref={endRef} />\n </div>\n )\n}\n\nfunction Composer({\n busy,\n onSend,\n onStop,\n voice,\n dictation,\n}: {\n busy: boolean\n onSend: (text: string, files?: ChatFilePayload[]) => Promise<void>\n onStop: () => void\n voice?: ComposerVoice\n dictation?: Dictation | null\n}) {\n const { t } = useAginies()\n const [value, setValue] = useState('')\n const [files, setFiles] = useState<ChatFilePayload[]>([])\n const [fileError, setFileError] = useState<string | null>(null)\n const fileInput = useRef<HTMLInputElement>(null)\n\n // A finished dictation lands in the draft so the visitor can read and edit it first.\n useEffect(() => {\n if (dictation) setValue((v) => (v.trim() ? `${v.trimEnd()} ${dictation.text}` : dictation.text))\n }, [dictation])\n\n const listening = voice?.state === 'listening'\n const transcribing = voice?.state === 'transcribing'\n\n const submit = (e: FormEvent) => {\n e.preventDefault()\n if (busy) return\n const text = value\n const attached = files\n setValue('')\n setFiles([])\n setFileError(null)\n void onSend(text, attached)\n }\n\n const pick = async (e: ChangeEvent<HTMLInputElement>) => {\n const chosen = Array.from(e.target.files ?? [])\n e.target.value = ''\n if (chosen.length === 0) return\n if (files.length + chosen.length > ATTACHMENT_LIMITS.maxFiles) {\n setFileError(t('chat', 'tooManyFiles'))\n return\n }\n if (chosen.some((file) => file.size > ATTACHMENT_LIMITS.maxBytes)) {\n setFileError(t('chat', 'fileTooLarge'))\n return\n }\n setFileError(null)\n const payloads = await Promise.all(chosen.map(readFile))\n setFiles((prev) => [...prev, ...payloads])\n }\n\n const canSend = value.trim().length > 0 || files.length > 0\n\n return (\n <form className='agi-chat__composer' onSubmit={submit}>\n {(files.length > 0 || fileError) && (\n <div className='agi-chat__pending'>\n {files.map((file, n) => (\n <span key={n} className='agi-file agi-file--pending'>\n <FileGlyph />\n <span className='agi-file__name'>{file.name}</span>\n <button\n type='button'\n className='agi-file__remove'\n aria-label={`${t('chat', 'removeFile')}: ${file.name}`}\n onClick={() => setFiles((prev) => prev.filter((_, i) => i !== n))}\n >\n ×\n </button>\n </span>\n ))}\n {fileError && <span className='agi-chat__file-error'>{fileError}</span>}\n </div>\n )}\n {voice?.error && <div className='agi-chat__file-error'>{voice.error}</div>}\n <div className='agi-chat__row'>\n <input\n ref={fileInput}\n type='file'\n multiple\n hidden\n onChange={pick}\n data-testid='agi-file-input'\n />\n <Button\n variant='ghost'\n type='button'\n aria-label={t('chat', 'attach')}\n title={t('chat', 'attach')}\n disabled={busy}\n onClick={() => fileInput.current?.click()}\n >\n <svg width='16' height='16' viewBox='0 0 24 24' fill='none' aria-hidden='true'>\n <path\n d='M21 12.5 12.8 20.7a5.5 5.5 0 0 1-7.8-7.8l8.6-8.6a3.5 3.5 0 0 1 5 5l-8.6 8.6a1.5 1.5 0 0 1-2.1-2.1L15.5 8'\n stroke='currentColor'\n strokeWidth='1.6'\n strokeLinecap='round'\n strokeLinejoin='round'\n />\n </svg>\n </Button>\n <Input\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={t('chat', 'placeholder')}\n aria-label={t('chat', 'placeholder')}\n autoComplete='off'\n />\n {voice && (\n <>\n <Button\n variant='ghost'\n type='button'\n className={cx('agi-chat__mic', listening && 'agi-chat__mic--on')}\n aria-label={listening ? t('voice', 'stopTalking') : t('voice', 'dictate')}\n aria-pressed={listening}\n title={listening ? t('voice', 'stopTalking') : t('voice', 'dictate')}\n disabled={busy || transcribing}\n onClick={() => (listening ? voice.stop() : void voice.start())}\n >\n {transcribing ? <Spinner label={t('voice', 'transcribing')} /> : <MicGlyph />}\n </Button>\n <Button\n variant='ghost'\n type='button'\n aria-label={t('voice', 'handsFree')}\n title={t('voice', 'handsFree')}\n disabled={busy || listening || transcribing}\n onClick={voice.onHandsFree}\n >\n <HeadsetGlyph />\n </Button>\n </>\n )}\n {busy ? (\n <Button variant='outline' onClick={onStop}>\n {t('chat', 'stop')}\n </Button>\n ) : (\n <Button variant='signal' type='submit' disabled={!canSend}>\n {t('chat', 'send')}\n </Button>\n )}\n </div>\n </form>\n )\n}\n\n/**\n * Hands-free conversation: the widget listens, sends what it heard, reads the reply aloud\n * when the platform can speak, and listens again. A tap while the agent speaks interrupts\n * it; a tap while listening ends the turn early.\n */\nfunction VoiceConversation({\n messages,\n busy,\n voice,\n speakReplies,\n onExit,\n}: {\n messages: ChatMessage[]\n busy: boolean\n voice: VoiceControls\n speakReplies: boolean\n onExit: () => void\n}) {\n const { t } = useAginies()\n const spokenRef = useRef<string | null>(null)\n const mountedRef = useRef(true)\n const lastAssistant = [...messages].reverse().find((m) => m.role === 'assistant')\n const lastUser = [...messages].reverse().find((m) => m.role === 'user')\n\n // Runs once on entering the mode; later turns are driven by the reply effect below.\n // biome-ignore lint/correctness/useExhaustiveDependencies: mount-only\n useEffect(() => {\n mountedRef.current = true\n spokenRef.current = lastAssistant?.id ?? null\n void voice.startListening()\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const replyId = lastAssistant?.id\n const replyStreaming = lastAssistant?.streaming === true\n // biome-ignore lint/correctness/useExhaustiveDependencies: a reply is handled once, when it completes\n useEffect(() => {\n if (!lastAssistant || replyStreaming || replyId === spokenRef.current) return\n spokenRef.current = replyId ?? null\n const run = async () => {\n if (speakReplies && lastAssistant.content && !lastAssistant.error) {\n await voice.speak(lastAssistant.content)\n }\n if (mountedRef.current) await voice.startListening()\n }\n void run()\n }, [replyId, replyStreaming])\n\n const status =\n voice.state === 'listening'\n ? t('voice', 'listening')\n : voice.state === 'transcribing'\n ? t('voice', 'transcribing')\n : voice.state === 'speaking'\n ? t('voice', 'speaking')\n : busy\n ? t('voice', 'thinking')\n : t('voice', 'idle')\n\n const hint =\n voice.state === 'listening'\n ? t('voice', 'stopTalking')\n : voice.state === 'speaking'\n ? t('voice', 'interrupt')\n : voice.state === 'transcribing' || busy\n ? ''\n : t('voice', 'talk')\n\n const tap = () => {\n if (voice.state === 'listening') voice.stopListening()\n else if (voice.state === 'speaking') {\n voice.stopSpeaking()\n void voice.startListening()\n } else if (voice.state === 'idle' && !busy) void voice.startListening()\n }\n\n return (\n <section className='agi-voice' aria-label={t('voice', 'handsFree')}>\n <button\n type='button'\n className='agi-voice__exit'\n onClick={onExit}\n aria-label={t('voice', 'exit')}\n >\n ×\n </button>\n <div className='agi-voice__status' aria-live='polite'>\n {status}\n </div>\n {lastUser?.content && <p className='agi-voice__you'>{lastUser.content}</p>}\n <div className='agi-voice__reply'>\n {lastAssistant?.content ? (\n <Markdown className='agi-md' text={lastAssistant.content} />\n ) : busy ? (\n <Spinner label={t('voice', 'thinking')} />\n ) : null}\n </div>\n <button\n type='button'\n className={cx(\n 'agi-voice__orb',\n `agi-voice__orb--${voice.state}`,\n busy && 'agi-voice__orb--busy'\n )}\n style={{ ['--agi-level' as string]: voice.level }}\n onClick={tap}\n aria-label={hint || status}\n disabled={voice.state === 'transcribing' || voice.state === 'unsupported'}\n >\n <MicGlyph size={28} />\n </button>\n <div className='agi-voice__hint'>{hint}</div>\n {voice.error && <div className='agi-voice__error'>{voice.error}</div>}\n </section>\n )\n}\n\nfunction MicGlyph({ size = 16 }: { size?: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='1.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n aria-hidden='true'\n >\n <rect x='9' y='3' width='6' height='11' rx='3' />\n <path d='M5 11a7 7 0 0 0 14 0M12 18v3M9 21h6' />\n </svg>\n )\n}\n\nfunction HeadsetGlyph() {\n return (\n <svg\n width='16'\n height='16'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='1.8'\n strokeLinecap='round'\n strokeLinejoin='round'\n aria-hidden='true'\n >\n <path d='M4 14v-2a8 8 0 0 1 16 0v2' />\n <rect x='3' y='13' width='4' height='6' rx='1.5' />\n <rect x='17' y='13' width='4' height='6' rx='1.5' />\n <path d='M19 19v1a2 2 0 0 1-2 2h-3' />\n </svg>\n )\n}\n\nfunction readFile(file: File): Promise<ChatFilePayload> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () =>\n resolve({\n name: file.name,\n type: file.type || 'application/octet-stream',\n size: file.size,\n data: String(reader.result),\n lastModified: file.lastModified,\n })\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n}\n\nfunction formatBytes(size: number): string {\n if (size < 1024) return `${size} B`\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(0)} KB`\n return `${(size / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction FileGlyph() {\n return (\n <svg width='12' height='12' viewBox='0 0 24 24' fill='none' aria-hidden='true'>\n <path\n d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8l-5-5z'\n stroke='currentColor'\n strokeWidth='1.8'\n strokeLinejoin='round'\n />\n <path d='M14 3v5h5' stroke='currentColor' strokeWidth='1.8' strokeLinejoin='round' />\n </svg>\n )\n}\n\nfunction ChatAuth({\n need,\n onPassword,\n onRequestCode,\n onVerifyCode,\n}: {\n need: Exclude<AuthNeed, null>\n onPassword: (c: { password: string }) => Promise<boolean>\n onRequestCode: (email: string) => Promise<CodeRequestResult>\n onVerifyCode: (email: string, code: string) => Promise<boolean>\n}) {\n const { t, client } = useAginies()\n\n if (need === 'sso') {\n return (\n <div className='agi-chat__state'>\n <h3>{t('auth', 'ssoTitle')}</h3>\n <p>{t('auth', 'ssoHint')}</p>\n <Button\n variant='signal'\n onClick={() => window.open(`${client.baseUrl}/chat/`, '_blank', 'noopener')}\n >\n {t('auth', 'ssoButton')}\n </Button>\n </div>\n )\n }\n\n if (need === 'email') {\n return <EmailAuth onRequestCode={onRequestCode} onVerifyCode={onVerifyCode} />\n }\n\n return <PasswordAuth onPassword={onPassword} />\n}\n\nfunction PasswordAuth({\n onPassword,\n}: {\n onPassword: (c: { password: string }) => Promise<boolean>\n}) {\n const { t } = useAginies()\n const [value, setValue] = useState('')\n const [error, setError] = useState<string | null>(null)\n const [pending, setPending] = useState(false)\n\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n setPending(true)\n setError(null)\n const ok = await onPassword({ password: value })\n setPending(false)\n if (!ok) setError(t('auth', 'invalidPassword'))\n }\n\n return (\n <form className='agi-chat__state agi-chat__auth' onSubmit={submit}>\n <h3>{t('auth', 'passwordTitle')}</h3>\n <p>{t('auth', 'passwordHint')}</p>\n <Field label={t('auth', 'password')} error={error ?? undefined}>\n <Input\n type='password'\n value={value}\n onChange={(e) => setValue(e.target.value)}\n required\n autoComplete='current-password'\n />\n </Field>\n <Button variant='signal' type='submit' disabled={pending || !value}>\n {t('auth', 'continue')}\n </Button>\n </form>\n )\n}\n\n/**\n * Two steps, mirroring the platform's hosted page: the address goes to the allow-list check\n * and receives a six-digit code; the code is then verified and the platform sets its cookie.\n */\nfunction EmailAuth({\n onRequestCode,\n onVerifyCode,\n}: {\n onRequestCode: (email: string) => Promise<CodeRequestResult>\n onVerifyCode: (email: string, code: string) => Promise<boolean>\n}) {\n const { t } = useAginies()\n const [email, setEmail] = useState('')\n const [code, setCode] = useState('')\n const [step, setStep] = useState<'email' | 'code'>('email')\n const [error, setError] = useState<string | null>(null)\n const [notice, setNotice] = useState<string | null>(null)\n const [pending, setPending] = useState(false)\n\n const request = async () => {\n setPending(true)\n setError(null)\n setNotice(null)\n const result = await onRequestCode(email.trim())\n setPending(false)\n if (result === 'sent') {\n setStep('code')\n setNotice(t('auth', 'codeSent'))\n } else {\n setError(t('auth', result === 'unauthorized' ? 'invalidEmail' : 'codeError'))\n }\n }\n\n const verify = async () => {\n setPending(true)\n setError(null)\n setNotice(null)\n const ok = await onVerifyCode(email.trim(), code.trim())\n setPending(false)\n if (!ok) setError(t('auth', 'invalidCode'))\n }\n\n const submit = (e: FormEvent) => {\n e.preventDefault()\n void (step === 'email' ? request() : verify())\n }\n\n if (step === 'code') {\n return (\n <form className='agi-chat__state agi-chat__auth' onSubmit={submit}>\n <h3>{t('auth', 'emailTitle')}</h3>\n <p>\n {t('auth', 'codeHint')} <strong>{email}</strong>\n </p>\n <Field label={t('auth', 'code')} error={error ?? undefined} hint={notice ?? undefined}>\n <Input\n inputMode='numeric'\n autoComplete='one-time-code'\n pattern='[0-9]{6}'\n maxLength={6}\n value={code}\n onChange={(e) => setCode(e.target.value.replace(/\\D/g, ''))}\n required\n />\n </Field>\n <div className='agi-chat__auth-actions'>\n <Button variant='signal' type='submit' disabled={pending || code.length !== 6}>\n {t('auth', 'verify')}\n </Button>\n <Button variant='ghost' type='button' disabled={pending} onClick={() => void request()}>\n {t('auth', 'resend')}\n </Button>\n <Button\n variant='ghost'\n type='button'\n disabled={pending}\n onClick={() => {\n setStep('email')\n setCode('')\n setError(null)\n setNotice(null)\n }}\n >\n {t('auth', 'back')}\n </Button>\n </div>\n </form>\n )\n }\n\n return (\n <form className='agi-chat__state agi-chat__auth' onSubmit={submit}>\n <h3>{t('auth', 'emailTitle')}</h3>\n <p>{t('auth', 'emailHint')}</p>\n <Field label={t('auth', 'email')} error={error ?? undefined}>\n <Input\n type='email'\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n autoComplete='email'\n />\n </Field>\n <Button variant='signal' type='submit' disabled={pending || !email.trim()}>\n {t('auth', 'sendCode')}\n </Button>\n </form>\n )\n}\n","import { Fragment, type ReactNode } from 'react'\n\n/**\n * Small Markdown renderer for agent replies. It builds React elements directly, so nothing\n * from the model reaches the DOM as HTML. Covers what agents actually write: paragraphs,\n * headings, emphasis, inline and fenced code, links, lists, blockquotes, tables and rules.\n */\nexport function Markdown({ text, className }: { text: string; className?: string }) {\n return <div className={className}>{renderBlocks(parseBlocks(text))}</div>\n}\n\n/* ───────────────────────────── blocks ───────────────────────────── */\n\ntype Block =\n | { kind: 'paragraph'; lines: string[] }\n | { kind: 'heading'; level: number; text: string }\n | { kind: 'code'; lang: string; code: string }\n | { kind: 'quote'; blocks: Block[] }\n | { kind: 'list'; ordered: boolean; start: number; items: string[] }\n | {\n kind: 'table'\n header: string[]\n align: Array<'left' | 'center' | 'right' | null>\n rows: string[][]\n }\n | { kind: 'rule' }\n\nconst FENCE = /^\\s*(`{3,}|~{3,})\\s*([\\w+-]*)\\s*$/\nconst HEADING = /^(#{1,6})\\s+(.*?)\\s*#*\\s*$/\nconst RULE = /^\\s*([-*_])(?:\\s*\\1){2,}\\s*$/\nconst QUOTE = /^\\s*>\\s?(.*)$/\nconst LIST = /^\\s*(?:([-*+])|(\\d{1,9})[.)])\\s+(.*)$/\nconst TABLE_SEPARATOR = /^\\s*\\|?\\s*:?-+:?\\s*(\\|\\s*:?-+:?\\s*)*\\|?\\s*$/\n\nexport function parseBlocks(text: string): Block[] {\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n')\n const blocks: Block[] = []\n let i = 0\n let paragraph: string[] = []\n\n const flush = () => {\n if (paragraph.length > 0) {\n blocks.push({ kind: 'paragraph', lines: paragraph })\n paragraph = []\n }\n }\n\n while (i < lines.length) {\n const line = lines[i] as string\n\n if (line.trim() === '') {\n flush()\n i += 1\n continue\n }\n\n const fence = FENCE.exec(line)\n if (fence) {\n flush()\n const marker = fence[1] as string\n const lang = fence[2] ?? ''\n const code: string[] = []\n i += 1\n while (i < lines.length && !(lines[i] as string).trim().startsWith(marker)) {\n code.push(lines[i] as string)\n i += 1\n }\n i += 1\n blocks.push({ kind: 'code', lang, code: code.join('\\n') })\n continue\n }\n\n const heading = HEADING.exec(line)\n if (heading) {\n flush()\n blocks.push({ kind: 'heading', level: (heading[1] as string).length, text: heading[2] ?? '' })\n i += 1\n continue\n }\n\n if (RULE.test(line)) {\n flush()\n blocks.push({ kind: 'rule' })\n i += 1\n continue\n }\n\n if (QUOTE.test(line)) {\n flush()\n const inner: string[] = []\n while (i < lines.length && QUOTE.test(lines[i] as string)) {\n inner.push((QUOTE.exec(lines[i] as string) as RegExpExecArray)[1] ?? '')\n i += 1\n }\n blocks.push({ kind: 'quote', blocks: parseBlocks(inner.join('\\n')) })\n continue\n }\n\n const list = LIST.exec(line)\n if (list) {\n flush()\n const ordered = list[2] !== undefined\n const start = ordered ? Number.parseInt(list[2] as string, 10) : 1\n const items: string[] = []\n while (i < lines.length) {\n const m = LIST.exec(lines[i] as string)\n if (m && (m[2] !== undefined) === ordered) {\n items.push(m[3] ?? '')\n i += 1\n } else if (\n items.length > 0 &&\n (lines[i] as string).trim() !== '' &&\n /^\\s{2,}/.test(lines[i] as string) &&\n !LIST.test(lines[i] as string)\n ) {\n // A continuation line indented under the previous item.\n items[items.length - 1] = `${items[items.length - 1]} ${(lines[i] as string).trim()}`\n i += 1\n } else {\n break\n }\n }\n blocks.push({ kind: 'list', ordered, start, items })\n continue\n }\n\n if (\n line.includes('|') &&\n i + 1 < lines.length &&\n TABLE_SEPARATOR.test(lines[i + 1] as string)\n ) {\n flush()\n const header = splitRow(line)\n const align = splitRow(lines[i + 1] as string).map((cell) => {\n const left = cell.startsWith(':')\n const right = cell.endsWith(':')\n if (left && right) return 'center'\n if (right) return 'right'\n if (left) return 'left'\n return null\n })\n const rows: string[][] = []\n i += 2\n while (i < lines.length && (lines[i] as string).includes('|')) {\n rows.push(splitRow(lines[i] as string))\n i += 1\n }\n blocks.push({ kind: 'table', header, align, rows })\n continue\n }\n\n paragraph.push(line)\n i += 1\n }\n flush()\n return blocks\n}\n\nfunction splitRow(line: string): string[] {\n const trimmed = line.trim().replace(/^\\|/, '').replace(/\\|$/, '')\n return trimmed.split(/(?<!\\\\)\\|/).map((cell) => cell.replace(/\\\\\\|/g, '|').trim())\n}\n\nfunction renderBlocks(blocks: Block[]): ReactNode[] {\n return blocks.map((block, index) => {\n switch (block.kind) {\n case 'paragraph':\n return (\n <p key={index}>\n {block.lines.map((line, n) => (\n <Fragment key={n}>\n {n > 0 && <br />}\n {renderInline(line)}\n </Fragment>\n ))}\n </p>\n )\n case 'heading': {\n const Tag = `h${Math.min(block.level + 2, 6)}` as 'h3' | 'h4' | 'h5' | 'h6'\n return <Tag key={index}>{renderInline(block.text)}</Tag>\n }\n case 'code':\n return (\n <pre key={index} data-lang={block.lang || undefined}>\n <code>{block.code}</code>\n </pre>\n )\n case 'quote':\n return <blockquote key={index}>{renderBlocks(block.blocks)}</blockquote>\n case 'list': {\n const items = block.items.map((item, n) => <li key={n}>{renderInline(item)}</li>)\n return block.ordered ? (\n <ol key={index} start={block.start === 1 ? undefined : block.start}>\n {items}\n </ol>\n ) : (\n <ul key={index}>{items}</ul>\n )\n }\n case 'table':\n return (\n <div key={index} className='agi-md__table'>\n <table>\n <thead>\n <tr>\n {block.header.map((cell, n) => (\n <th key={n} style={alignStyle(block.align[n])}>\n {renderInline(cell)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {block.rows.map((row, r) => (\n <tr key={r}>\n {block.header.map((_, n) => (\n <td key={n} style={alignStyle(block.align[n])}>\n {renderInline(row[n] ?? '')}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n case 'rule':\n return <hr key={index} />\n }\n })\n}\n\nfunction alignStyle(align: 'left' | 'center' | 'right' | null | undefined) {\n return align ? { textAlign: align } : undefined\n}\n\n/* ───────────────────────────── inline ───────────────────────────── */\n\nconst INLINE =\n /(`+)([\\s\\S]*?)\\1|\\*\\*([\\s\\S]+?)\\*\\*|(?<![\\w`])__([\\s\\S]+?)__(?![\\w])|~~([\\s\\S]+?)~~|\\*([^*\\n]+?)\\*|(?<![\\w`])_([^_\\n]+?)_(?![\\w])|\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)|(https?:\\/\\/[^\\s<]*[^\\s<.,;:!?)\\]'\"])/g\n\nexport function renderInline(text: string): ReactNode[] {\n const nodes: ReactNode[] = []\n let last = 0\n let key = 0\n // A fresh instance per call: the function recurses for nested emphasis, and a shared\n // global regex would have its lastIndex reset by the inner call.\n const inline = new RegExp(INLINE.source, 'g')\n let match = inline.exec(text)\n while (match) {\n if (match.index > last) nodes.push(text.slice(last, match.index))\n const [, , code, bold, boldAlt, strike, italic, italicAlt, linkText, linkHref, autoHref] = match\n if (code !== undefined) {\n nodes.push(<code key={key++}>{code.trim()}</code>)\n } else if (bold !== undefined || boldAlt !== undefined) {\n nodes.push(<strong key={key++}>{renderInline((bold ?? boldAlt) as string)}</strong>)\n } else if (strike !== undefined) {\n nodes.push(<del key={key++}>{renderInline(strike)}</del>)\n } else if (italic !== undefined || italicAlt !== undefined) {\n nodes.push(<em key={key++}>{renderInline((italic ?? italicAlt) as string)}</em>)\n } else if (linkText !== undefined && linkHref !== undefined) {\n nodes.push(link(key++, linkHref, renderInline(linkText)))\n } else if (autoHref !== undefined) {\n nodes.push(link(key++, autoHref, autoHref))\n }\n last = match.index + match[0].length\n match = inline.exec(text)\n }\n if (last < text.length) nodes.push(text.slice(last))\n return nodes\n}\n\nconst SAFE_HREF = /^(https?:\\/\\/|mailto:)/i\n\nfunction link(key: number, href: string, children: ReactNode): ReactNode {\n if (!SAFE_HREF.test(href)) return <Fragment key={key}>{children}</Fragment>\n return (\n <a key={key} href={href} target='_blank' rel='noopener noreferrer'>\n {children}\n </a>\n )\n}\n","/**\n * Structured replies: an agent may answer with a JSON document of items (text, buttons,\n * table, cards, pie, image) instead of prose. This mirrors the contract the platform's\n * hosted chat renders, so a workflow tuned for one renders identically in the widget.\n */\n\nexport interface StructuredButton {\n label: string\n action: string\n}\nexport interface StructuredTable {\n headers: string[]\n rows: string[][]\n}\nexport interface StructuredCard {\n title: string\n subtitle: string\n body: string\n image: string\n}\nexport interface StructuredPie {\n labels: string[]\n data: number[]\n}\nexport interface StructuredImage {\n url: string\n caption: string\n}\nexport interface StructuredItem {\n text: { content: string }\n buttons: StructuredButton[]\n table: StructuredTable\n cards: StructuredCard[]\n pie: StructuredPie\n image: StructuredImage\n}\nexport interface StructuredResponse {\n items: StructuredItem[]\n}\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\nconst isStringArray = (v: unknown): v is string[] =>\n Array.isArray(v) && v.every((x) => typeof x === 'string')\nconst isNumberArray = (v: unknown): v is number[] =>\n Array.isArray(v) && v.every((x) => typeof x === 'number')\n\nfunction isCard(v: unknown): v is StructuredCard {\n return (\n isObject(v) &&\n typeof v.title === 'string' &&\n typeof v.subtitle === 'string' &&\n typeof v.body === 'string' &&\n typeof v.image === 'string'\n )\n}\n\nfunction normaliseItem(raw: unknown): StructuredItem | null {\n if (!isObject(raw)) return null\n const text = raw.text\n const buttons = raw.buttons\n const table = raw.table\n const pie = raw.pie\n const image = raw.image\n const cards = Array.isArray(raw.cards) ? raw.cards : raw.card ? [raw.card] : []\n if (!isObject(text) || typeof text.content !== 'string') return null\n if (\n !Array.isArray(buttons) ||\n !buttons.every(\n (b) => isObject(b) && typeof b.label === 'string' && typeof b.action === 'string'\n )\n )\n return null\n if (\n !isObject(table) ||\n !isStringArray(table.headers) ||\n !Array.isArray(table.rows) ||\n !table.rows.every(isStringArray)\n )\n return null\n if (!cards.every(isCard)) return null\n if (!isObject(pie) || !isStringArray(pie.labels) || !isNumberArray(pie.data)) return null\n if (!isObject(image) || typeof image.url !== 'string' || typeof image.caption !== 'string')\n return null\n return {\n text: { content: text.content },\n buttons: buttons as StructuredButton[],\n table: table as unknown as StructuredTable,\n cards: cards as StructuredCard[],\n pie: pie as unknown as StructuredPie,\n image: image as unknown as StructuredImage,\n }\n}\n\n/** Parses a reply into a structured response, or null when it is ordinary prose. */\nexport function parseStructured(raw: string): StructuredResponse | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return null\n }\n const list = Array.isArray(parsed)\n ? parsed\n : isObject(parsed) && Array.isArray(parsed.items)\n ? parsed.items\n : null\n if (!list) return null\n const items = list.map(normaliseItem)\n if (items.some((i) => i === null)) return null\n return { items: items as StructuredItem[] }\n}\n\n/* ───────────────────────────── renderer ───────────────────────────── */\n\nexport interface StructuredUIProps {\n response: StructuredResponse\n /** Called with the button's action text; the widget sends it as the next message. */\n onAction?: (action: string) => void\n}\n\nexport function StructuredUI({ response, onAction }: StructuredUIProps) {\n return (\n <div className='agi-sui'>\n {response.items.map((item, i) => (\n <div key={i} className='agi-sui__item'>\n {item.text.content && <p className='agi-sui__text'>{item.text.content}</p>}\n {item.image.url && (\n <figure className='agi-sui__figure'>\n <img src={item.image.url} alt={item.image.caption} />\n {item.image.caption && <figcaption>{item.image.caption}</figcaption>}\n </figure>\n )}\n {item.cards.length > 0 && (\n <div className='agi-sui__cards'>\n {item.cards.map((c, ci) => (\n <div key={ci} className='agi-panel agi-sui__card'>\n {c.image && <img src={c.image} alt='' />}\n <div>\n <div className='agi-sui__card-title'>{c.title}</div>\n {c.subtitle && <div className='agi-sui__card-sub'>{c.subtitle}</div>}\n {c.body && <p>{c.body}</p>}\n </div>\n </div>\n ))}\n </div>\n )}\n {item.table.headers.length > 0 && (\n <div className='agi-sui__scroll'>\n <table className='agi-table'>\n <thead>\n <tr>\n {item.table.headers.map((h, hi) => (\n <th key={hi}>{h}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {item.table.rows.map((r, ri) => (\n <tr key={ri}>\n {r.map((cell, ci) => (\n <td key={ci}>{cell}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {item.pie.labels.length > 0 && <Pie labels={item.pie.labels} data={item.pie.data} />}\n {item.buttons.length > 0 && (\n <div className='agi-sui__actions'>\n {item.buttons.map((b, bi) => (\n <button\n key={bi}\n type='button'\n className='agi-chip'\n onClick={() => onAction?.(b.action)}\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n )\n}\n\nfunction Pie({ labels, data }: StructuredPie) {\n const total = data.reduce((a, b) => a + Math.max(0, b), 0)\n if (total <= 0) return null\n let angle = 0\n const slices = labels.map((label, i) => {\n const value = Math.max(0, data[i] ?? 0)\n const start = angle\n angle += (value / total) * 360\n return { label, value, start, end: angle, color: `var(--data-${(i % 6) + 1})` }\n })\n const arc = (start: number, end: number) => {\n const r = 48\n const cx = 50\n const cy = 50\n const a0 = ((start - 90) * Math.PI) / 180\n const a1 = ((end - 90) * Math.PI) / 180\n const large = end - start > 180 ? 1 : 0\n const x0 = cx + r * Math.cos(a0)\n const y0 = cy + r * Math.sin(a0)\n const x1 = cx + r * Math.cos(a1)\n const y1 = cy + r * Math.sin(a1)\n if (end - start >= 360) return `M${cx} ${cy - r} A${r} ${r} 0 1 1 ${cx - 0.01} ${cy - r} Z`\n return `M${cx} ${cy} L${x0} ${y0} A${r} ${r} 0 ${large} 1 ${x1} ${y1} Z`\n }\n return (\n <div className='agi-sui__pie'>\n <svg viewBox='0 0 100 100' role='img' aria-label={labels.join(', ')}>\n <title>{labels.join(', ')}</title>\n {slices.map((s) => (\n <path key={s.label} d={arc(s.start, s.end)} fill={s.color} />\n ))}\n </svg>\n <ul>\n {slices.map((s) => (\n <li key={s.label}>\n <span style={{ background: s.color }} />\n {s.label}\n <b>{Math.round((s.value / total) * 100)}%</b>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { AginiesError } from '../client'\nimport { useAginies } from '../provider'\n\n/**\n * Voice for the chat widget: records the visitor with the browser's recorder, sends the\n * clip to the platform (which runs its own transcription model) and plays replies back\n * from the platform's synthesis endpoint. No third-party browser speech API is involved,\n * so it behaves the same in every browser and the audio never leaves the platform.\n */\n\nexport type VoiceState =\n | 'idle'\n | 'listening'\n | 'transcribing'\n | 'speaking'\n | 'denied'\n | 'unsupported'\n\nexport interface UseVoiceOptions {\n identifier: string\n /** Receives the transcript of a finished recording; empty recordings are dropped. */\n onTranscript: (text: string) => void\n /** Language hint for transcription; omit for auto-detection. */\n language?: string\n /** Stop recording after this much silence once speech was heard. */\n silenceMs?: number\n /** Longest single recording. */\n maxMs?: number\n}\n\nexport interface VoiceControls {\n state: VoiceState\n /** Last failure, cleared on the next successful action. */\n error: string | null\n /** Whether this browser can record at all. */\n supported: boolean\n /** Input level 0..1 while listening, for a meter. */\n level: number\n startListening: () => Promise<void>\n /** Ends the recording and transcribes it. */\n stopListening: () => void\n /** Ends the recording and discards it. */\n cancelListening: () => void\n /** Plays a reply; resolves when playback ends or is stopped. */\n speak: (text: string) => Promise<void>\n stopSpeaking: () => void\n}\n\nconst MIME_CANDIDATES = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n 'audio/ogg;codecs=opus',\n]\n/** Recordings shorter than this are noise from a tap, not speech. */\nconst MIN_CLIP_BYTES = 800\nconst SPEECH_RMS = 0.02\n\nexport function isVoiceSupported(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof navigator !== 'undefined' &&\n !!navigator.mediaDevices?.getUserMedia &&\n typeof MediaRecorder !== 'undefined'\n )\n}\n\nexport function useVoice({\n identifier,\n onTranscript,\n language,\n silenceMs = 1400,\n maxMs = 60_000,\n}: UseVoiceOptions): VoiceControls {\n const { client, t } = useAginies()\n const supported = isVoiceSupported()\n const [state, setState] = useState<VoiceState>(supported ? 'idle' : 'unsupported')\n const [error, setError] = useState<string | null>(null)\n const [level, setLevel] = useState(0)\n\n const recorderRef = useRef<MediaRecorder | null>(null)\n const streamRef = useRef<MediaStream | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const discardRef = useRef(false)\n const timersRef = useRef<number[]>([])\n const meterRef = useRef<{ ctx: AudioContext; interval: number } | null>(null)\n const audioRef = useRef<HTMLAudioElement | null>(null)\n const audioUrlRef = useRef<string | null>(null)\n const startingRef = useRef(false)\n const onTranscriptRef = useRef(onTranscript)\n onTranscriptRef.current = onTranscript\n\n const clearTimers = useCallback(() => {\n for (const id of timersRef.current) window.clearTimeout(id)\n timersRef.current = []\n if (meterRef.current) {\n window.clearInterval(meterRef.current.interval)\n void meterRef.current.ctx.close().catch(() => {})\n meterRef.current = null\n }\n setLevel(0)\n }, [])\n\n const releaseStream = useCallback(() => {\n for (const track of streamRef.current?.getTracks() ?? []) track.stop()\n streamRef.current = null\n }, [])\n\n const stopSpeaking = useCallback(() => {\n const audio = audioRef.current\n if (audio) {\n audio.pause()\n audio.src = ''\n audioRef.current = null\n }\n if (audioUrlRef.current) {\n URL.revokeObjectURL(audioUrlRef.current)\n audioUrlRef.current = null\n }\n setState((s) => (s === 'speaking' ? 'idle' : s))\n }, [])\n\n const finish = useCallback((recorder: MediaRecorder) => {\n recorder.stop()\n }, [])\n\n const stopListening = useCallback(() => {\n const recorder = recorderRef.current\n if (!recorder || recorder.state === 'inactive') return\n discardRef.current = false\n finish(recorder)\n }, [finish])\n\n const cancelListening = useCallback(() => {\n const recorder = recorderRef.current\n if (!recorder || recorder.state === 'inactive') return\n discardRef.current = true\n finish(recorder)\n }, [finish])\n\n const startMeter = useCallback(\n (stream: MediaStream, onSilence: () => void) => {\n const Ctx =\n typeof AudioContext !== 'undefined'\n ? AudioContext\n : (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext\n if (!Ctx) return\n try {\n const ctx = new Ctx()\n const analyser = ctx.createAnalyser()\n analyser.fftSize = 2048\n ctx.createMediaStreamSource(stream).connect(analyser)\n const data = new Uint8Array(analyser.fftSize)\n let heard = false\n let lastVoice = Date.now()\n const interval = window.setInterval(() => {\n analyser.getByteTimeDomainData(data)\n let sum = 0\n for (const v of data) {\n const n = (v - 128) / 128\n sum += n * n\n }\n const rms = Math.sqrt(sum / data.length)\n setLevel(Math.min(1, rms * 6))\n if (rms > SPEECH_RMS) {\n heard = true\n lastVoice = Date.now()\n } else if (heard && Date.now() - lastVoice > silenceMs) {\n onSilence()\n }\n }, 100)\n meterRef.current = { ctx, interval }\n } catch {\n // No meter: the visitor stops the recording by hand or the cap ends it.\n }\n },\n [silenceMs]\n )\n\n const startListening = useCallback(async () => {\n if (!supported) {\n setState('unsupported')\n return\n }\n if (startingRef.current) return\n if (recorderRef.current && recorderRef.current.state !== 'inactive') return\n startingRef.current = true\n stopSpeaking()\n setError(null)\n\n let stream: MediaStream\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n } catch {\n startingRef.current = false\n setState('denied')\n setError(t('voice', 'micDenied'))\n return\n }\n startingRef.current = false\n streamRef.current = stream\n\n const mimeType = MIME_CANDIDATES.find((m) => MediaRecorder.isTypeSupported?.(m))\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined)\n recorderRef.current = recorder\n chunksRef.current = []\n discardRef.current = false\n\n recorder.ondataavailable = (e) => {\n if (e.data && e.data.size > 0) chunksRef.current.push(e.data)\n }\n recorder.onstop = () => {\n clearTimers()\n releaseStream()\n recorderRef.current = null\n const type = recorder.mimeType || mimeType || 'audio/webm'\n const clip = new Blob(chunksRef.current, { type })\n chunksRef.current = []\n if (discardRef.current || clip.size < MIN_CLIP_BYTES) {\n setState('idle')\n return\n }\n setState('transcribing')\n const ext = type.includes('mp4') ? 'm4a' : type.includes('ogg') ? 'ogg' : 'webm'\n client\n .transcribe(identifier, clip, `turn.${ext}`, language)\n .then((result) => {\n setState('idle')\n if (result.transcript) onTranscriptRef.current(result.transcript)\n })\n .catch((err) => {\n setState('idle')\n setError(\n err instanceof AginiesError && err.code === 'VOICE_UNAVAILABLE'\n ? t('voice', 'unavailable')\n : t('voice', 'error')\n )\n })\n }\n\n recorder.start(250)\n setState('listening')\n startMeter(stream, () => stopListening())\n timersRef.current.push(window.setTimeout(() => stopListening(), maxMs))\n }, [\n supported,\n stopSpeaking,\n t,\n client,\n identifier,\n language,\n maxMs,\n stopListening,\n clearTimers,\n releaseStream,\n startMeter,\n ])\n\n const speak = useCallback(\n async (text: string) => {\n stopSpeaking()\n setError(null)\n setState('speaking')\n try {\n const blob = await client.speak(identifier, text)\n const url = URL.createObjectURL(blob)\n audioUrlRef.current = url\n const audio = new Audio(url)\n audioRef.current = audio\n await new Promise<void>((resolve) => {\n audio.onended = () => resolve()\n audio.onerror = () => resolve()\n audio.onpause = () => resolve()\n audio.play().catch(() => resolve())\n })\n } catch (err) {\n setError(\n err instanceof AginiesError && err.code === 'VOICE_UNAVAILABLE'\n ? t('voice', 'unavailable')\n : t('voice', 'error')\n )\n } finally {\n if (audioUrlRef.current) URL.revokeObjectURL(audioUrlRef.current)\n audioUrlRef.current = null\n audioRef.current = null\n setState((s) => (s === 'speaking' ? 'idle' : s))\n }\n },\n [client, identifier, stopSpeaking, t]\n )\n\n useEffect(\n () => () => {\n discardRef.current = true\n if (recorderRef.current && recorderRef.current.state !== 'inactive')\n recorderRef.current.stop()\n clearTimers()\n releaseStream()\n const audio = audioRef.current\n if (audio) audio.pause()\n if (audioUrlRef.current) URL.revokeObjectURL(audioUrlRef.current)\n },\n [clearTimers, releaseStream]\n )\n\n return {\n state,\n error,\n supported,\n level,\n startListening,\n stopListening,\n cancelListening,\n speak,\n stopSpeaking,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { cx, Tag } from '../core'\n\n/**\n * Observability widgets. Data-driven: they render whatever the host passes, so they work\n * with the platform's log and stats endpoints, a data warehouse or static numbers alike.\n */\n\n/* ───────────────────────────── stat tiles ───────────────────────────── */\n\nexport interface StatItem {\n value: string\n label: string\n /** Small trend note, e.g. \"+4.2% vs last week\". */\n delta?: string\n tone?: 'default' | 'ok' | 'warn' | 'bad'\n}\n\nexport function StatTiles({\n items,\n className,\n ...props\n}: { items: StatItem[] } & HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cx('agi-stats', className)} {...props}>\n {items.map((s) => (\n <div key={s.label} className='agi-panel agi-stats__tile'>\n <div className={cx('agi-stat__v', s.tone && s.tone !== 'default' && `is-${s.tone}`)}>\n {s.value}\n </div>\n <div className='agi-stat__k'>{s.label}</div>\n {s.delta && <div className='agi-stats__delta'>{s.delta}</div>}\n </div>\n ))}\n </div>\n )\n}\n\n/* ───────────────────────────── success heatmap ───────────────────────────── */\n\nexport interface HeatmapRow {\n label: string\n /** Success rates 0–1 per column (e.g. per day or per hour); null for no runs. */\n values: Array<number | null>\n}\n\nexport interface SuccessHeatmapProps extends HTMLAttributes<HTMLDivElement> {\n rows: HeatmapRow[]\n /** Column labels, same length as each row's values. */\n columns?: string[]\n /** Below `warn` a cell reads as warning, below `bad` as failure. Defaults 0.95 / 0.85. */\n thresholds?: { warn: number; bad: number }\n /** Formats the tooltip; default \"97.2%\". */\n format?: (value: number) => string\n}\n\nconst pct = (v: number) => `${(v * 100).toFixed(1)}%`\n\nexport function SuccessHeatmap({\n rows,\n columns,\n thresholds = { warn: 0.95, bad: 0.85 },\n format = pct,\n className,\n ...props\n}: SuccessHeatmapProps) {\n const cols =\n columns ?? Array.from({ length: rows[0]?.values.length ?? 0 }, (_, i) => String(i + 1))\n return (\n <div className={cx('agi-heat', className)} {...props}>\n <table className='agi-heat__table'>\n <thead>\n <tr>\n <th className='agi-heat__label' />\n {cols.map((c) => (\n <th key={c} className='agi-heat__col' scope='col'>\n {c}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((r) => (\n <tr key={r.label}>\n <th className='agi-heat__label' scope='row'>\n {r.label}\n </th>\n {r.values.map((v, i) => {\n const tone =\n v === null\n ? 'none'\n : v < thresholds.bad\n ? 'bad'\n : v < thresholds.warn\n ? 'warn'\n : 'ok'\n return (\n <td key={i} className='agi-heat__td'>\n <span\n className={cx('agi-heat__cell', `is-${tone}`)}\n title={v === null ? '—' : format(v)}\n style={\n v === null\n ? undefined\n : { opacity: 0.35 + 0.65 * Math.min(1, Math.max(0, (v - 0.5) / 0.5)) }\n }\n />\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n <div className='agi-heat__legend'>\n <Tag tone='ok'>≥ {pct(thresholds.warn)}</Tag>\n <Tag tone='warn'>≥ {pct(thresholds.bad)}</Tag>\n <Tag tone='bad'>&lt; {pct(thresholds.bad)}</Tag>\n </div>\n </div>\n )\n}\n\n/* ───────────────────────────── run timeline ───────────────────────────── */\n\nexport interface TimelineStep {\n id: string\n name: string\n /** Step kind in the platform vocabulary; drives the glyph and colour. */\n kind?:\n | 'ingest'\n | 'plan'\n | 'retrieve'\n | 'reason'\n | 'tool'\n | 'verify'\n | 'approval'\n | 'write'\n | 'notify'\n status: 'done' | 'running' | 'error' | 'waiting'\n /** Offset from the run start in ms. */\n startMs: number\n durationMs?: number\n tokens?: number\n costUsd?: number\n detail?: string\n}\n\nconst GLYPH: Record<NonNullable<TimelineStep['kind']>, string> = {\n ingest: '◦',\n plan: '⌘',\n retrieve: '⌕',\n reason: '∿',\n tool: '⚙',\n verify: '✓',\n approval: '⏸',\n write: '⇢',\n notify: '➤',\n}\n\nconst fmtMs = (x: number) => (x < 1000 ? `${Math.round(x)} ms` : `${(x / 1000).toFixed(1)} s`)\n\nexport interface RunTimelineProps extends HTMLAttributes<HTMLOListElement> {\n steps: TimelineStep[]\n /** Total run duration for the bar scale; defaults to the last step's end. */\n totalMs?: number\n}\n\nexport function RunTimeline({ steps, totalMs, className, ...props }: RunTimelineProps) {\n const end = totalMs ?? Math.max(1, ...steps.map((s) => s.startMs + (s.durationMs ?? 0)))\n return (\n <ol className={cx('agi-timeline', className)} {...props}>\n {steps.map((s) => (\n <li\n key={s.id}\n className={cx('agi-timeline__step', `is-${s.status}`, s.kind && `k-${s.kind}`)}\n >\n <span className='agi-timeline__glyph' aria-hidden='true'>\n {s.kind ? GLYPH[s.kind] : '•'}\n </span>\n <span className='agi-timeline__name'>\n {s.name}\n {s.detail && <span className='agi-timeline__detail'>{s.detail}</span>}\n </span>\n <span className='agi-timeline__bar' aria-hidden='true'>\n <span\n className='agi-timeline__fill'\n style={{\n left: `${(s.startMs / end) * 100}%`,\n width: `${Math.max(1, ((s.durationMs ?? 0) / end) * 100)}%`,\n }}\n />\n </span>\n <span className='agi-timeline__meta'>\n {s.durationMs !== undefined && fmtMs(s.durationMs)}\n {s.tokens !== undefined && ` · ${s.tokens} tok`}\n {s.costUsd !== undefined && ` · $${s.costUsd.toFixed(3)}`}\n </span>\n </li>\n ))}\n </ol>\n )\n}\n\n/* ───────────────────────────── cost bars ───────────────────────────── */\n\nexport interface CostBarItem {\n label: string\n value: number\n /** Optional right-hand caption, e.g. \"1,240 runs\". */\n note?: string\n}\n\nexport interface CostBarsProps extends HTMLAttributes<HTMLDivElement> {\n items: CostBarItem[]\n /** Formats the value; default USD with two decimals. */\n format?: (value: number) => string\n}\n\nconst usd = (v: number) => `$${v.toFixed(2)}`\n\nexport function CostBars({ items, format = usd, className, ...props }: CostBarsProps) {\n const max = Math.max(1e-9, ...items.map((i) => i.value))\n return (\n <div className={cx('agi-bars', className)} {...props}>\n {items.map((i, idx) => (\n <div key={i.label} className='agi-bars__row'>\n <span className='agi-bars__label'>{i.label}</span>\n <span className='agi-bars__track' aria-hidden='true'>\n <span\n className='agi-bars__fill'\n style={{\n width: `${(i.value / max) * 100}%`,\n background: `var(--data-${(idx % 6) + 1})`,\n }}\n />\n </span>\n <span className='agi-bars__value'>\n {format(i.value)}\n {i.note && <span className='agi-bars__note'>{i.note}</span>}\n </span>\n </div>\n ))}\n </div>\n )\n}\n","import { type FormEvent, useCallback, useEffect, useRef, useState } from 'react'\nimport { AginiesError } from '../client'\nimport { Button, cx, Field, Input, Panel, Spinner, Tag, Textarea } from '../core'\nimport { useAginies, useModule } from '../provider'\nimport { type RunEvent, runAgent } from './run-client'\n\nexport interface RunStep {\n blockId: string\n name: string\n status: 'running' | 'done' | 'error'\n durationMs?: number\n}\n\nexport type RunStatus = 'idle' | 'running' | 'done' | 'error'\n\n/**\n * State for one deployed agent: run it with structured input, follow the streamed text\n * and steps, read the final output. `AgentRunner` renders it; use the hook for a custom UI.\n */\nexport function useAgentRun(workflowId: string, apiKey: string) {\n const { client, t } = useAginies()\n const [status, setStatus] = useState<RunStatus>('idle')\n const [text, setText] = useState('')\n const [steps, setSteps] = useState<RunStep[]>([])\n const [output, setOutput] = useState<unknown>(null)\n const [error, setError] = useState<string | null>(null)\n const [executionId, setExecutionId] = useState<string | undefined>()\n const abortRef = useRef<AbortController | null>(null)\n\n const cancel = useCallback(() => {\n abortRef.current?.abort()\n abortRef.current = null\n setStatus((s) => (s === 'running' ? 'idle' : s))\n }, [])\n\n const run = useCallback(\n async (input: unknown) => {\n abortRef.current?.abort()\n const controller = new AbortController()\n abortRef.current = controller\n setStatus('running')\n setText('')\n setSteps([])\n setOutput(null)\n setError(null)\n try {\n for await (const ev of runAgent(client, workflowId, { apiKey, input }, controller.signal)) {\n apply(ev)\n }\n } catch (err) {\n if (controller.signal.aborted) return\n setError(\n err instanceof AginiesError && err.code === 'UNAUTHORIZED'\n ? t('run', 'unauthorized')\n : err instanceof Error\n ? err.message\n : t('run', 'failed')\n )\n setStatus('error')\n } finally {\n if (abortRef.current === controller) abortRef.current = null\n }\n\n function apply(ev: RunEvent) {\n switch (ev.type) {\n case 'started':\n setExecutionId(ev.executionId)\n break\n case 'chunk':\n setText((s) => s + ev.text)\n break\n case 'step':\n setSteps((prev) => {\n const i = prev.findIndex((s) => s.blockId === ev.blockId)\n const next: RunStep = {\n blockId: ev.blockId,\n name: ev.name,\n status: ev.status,\n durationMs: ev.durationMs,\n }\n if (i === -1) return [...prev, next]\n const copy = [...prev]\n copy[i] = next\n return copy\n })\n break\n case 'done':\n setOutput(ev.output)\n setStatus(ev.success ? 'done' : 'error')\n break\n case 'error':\n setError(ev.message)\n setStatus('error')\n break\n }\n }\n },\n [client, workflowId, apiKey, t]\n )\n\n return { status, text, steps, output, error, executionId, run, cancel }\n}\n\n/* ───────────────────────────── component ───────────────────────────── */\n\nexport interface RunField {\n name: string\n label: string\n type?: 'text' | 'textarea' | 'number' | 'select' | 'boolean'\n required?: boolean\n placeholder?: string\n options?: Array<{ value: string; label: string }>\n defaultValue?: string | number | boolean\n}\n\nexport interface AgentRunnerProps {\n /** Id of the deployed agent (workflow). */\n workflowId: string\n /** An `execute`-scoped API key for this agent. Visible to the page; never a personal key. */\n apiKey: string\n /** Form fields; their values become the agent's input object. Omit for a single text box. */\n fields?: RunField[]\n title?: string\n description?: string\n submitLabel?: string\n /** Called with the final output of a successful run. */\n onResult?: (output: unknown) => void\n className?: string\n}\n\nconst DEFAULT_FIELDS: RunField[] = [\n { name: 'input', label: 'Input', type: 'textarea', required: true },\n]\n\nexport function AgentRunner({\n workflowId,\n apiKey,\n fields = DEFAULT_FIELDS,\n title,\n description,\n submitLabel,\n onResult,\n className,\n}: AgentRunnerProps) {\n const { t } = useAginies()\n const enabled = useModule('run')\n const agent = useAgentRun(workflowId, apiKey)\n const [values, setValues] = useState<Record<string, string | number | boolean>>(() =>\n Object.fromEntries(\n fields.map((f) => [f.name, f.defaultValue ?? (f.type === 'boolean' ? false : '')])\n )\n )\n const set = (name: string, value: string | number | boolean) =>\n setValues((v) => ({ ...v, [name]: value }))\n\n const submit = async (e: FormEvent) => {\n e.preventDefault()\n if (agent.status === 'running') return\n const input =\n fields.length === 1 && fields[0]?.name === 'input' && fields[0]?.type === 'textarea'\n ? values.input\n : values\n await agent.run(input)\n }\n const onResultRef = useRef(onResult)\n onResultRef.current = onResult\n useEffect(() => {\n if (agent.status === 'done') onResultRef.current?.(agent.output)\n }, [agent.status, agent.output])\n if (!enabled) return null\n\n return (\n <Panel className={cx('agi-run', className)}>\n {(title || description) && (\n <header className='agi-run__head'>\n {title && <h3 className='agi-run__title'>{title}</h3>}\n {description && <p className='agi-run__desc'>{description}</p>}\n </header>\n )}\n <form className='agi-run__form' onSubmit={submit}>\n {fields.map((f) => (\n <Field key={f.name} label={f.label}>\n {f.type === 'textarea' ? (\n <Textarea\n required={f.required}\n placeholder={f.placeholder}\n value={String(values[f.name] ?? '')}\n onChange={(e) => set(f.name, e.target.value)}\n />\n ) : f.type === 'select' ? (\n <select\n className='agi-input'\n required={f.required}\n value={String(values[f.name] ?? '')}\n onChange={(e) => set(f.name, e.target.value)}\n >\n <option value=''>—</option>\n {f.options?.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n ) : f.type === 'boolean' ? (\n <input\n type='checkbox'\n className='agi-checkbox'\n checked={Boolean(values[f.name])}\n onChange={(e) => set(f.name, e.target.checked)}\n />\n ) : (\n <Input\n type={f.type === 'number' ? 'number' : 'text'}\n required={f.required}\n placeholder={f.placeholder}\n value={String(values[f.name] ?? '')}\n onChange={(e) =>\n set(f.name, f.type === 'number' ? Number(e.target.value) : e.target.value)\n }\n />\n )}\n </Field>\n ))}\n <div className='agi-run__actions'>\n {agent.status === 'running' ? (\n <Button variant='outline' onClick={agent.cancel}>\n {t('run', 'cancel')}\n </Button>\n ) : (\n <Button variant='signal' type='submit'>\n {submitLabel ?? t('run', 'submit')}\n </Button>\n )}\n {agent.status === 'running' && (\n <span className='agi-run__status'>\n <Spinner label={t('run', 'running')} /> {t('run', 'running')}\n </span>\n )}\n {agent.status === 'done' && <Tag tone='ok'>{t('run', 'done')}</Tag>}\n {agent.status === 'error' && <Tag tone='bad'>{t('run', 'error')}</Tag>}\n </div>\n </form>\n\n {agent.steps.length > 0 && (\n <ol className='agi-run__steps' aria-label={t('run', 'steps')}>\n {agent.steps.map((s) => (\n <li key={s.blockId} className={`agi-run__step is-${s.status}`}>\n <span className='agi-run__step-dot' />\n <span className='agi-run__step-name'>{s.name}</span>\n {s.durationMs !== undefined && (\n <span className='agi-run__step-meta'>{s.durationMs} ms</span>\n )}\n </li>\n ))}\n </ol>\n )}\n\n {(agent.text || agent.output !== null || agent.error) && (\n <section className='agi-run__result' aria-live='polite'>\n {agent.error && <p className='agi-run__error'>{agent.error}</p>}\n {agent.text && <p className='agi-run__text'>{agent.text}</p>}\n {!agent.text && agent.output !== null && (\n <pre className='agi-run__output'>{formatOutput(agent.output)}</pre>\n )}\n {agent.executionId && (\n <p className='agi-run__meta'>\n {t('run', 'execution')} <b>{agent.executionId}</b>\n </p>\n )}\n </section>\n )}\n </Panel>\n )\n}\n\nfunction formatOutput(output: unknown): string {\n if (typeof output === 'string') return output\n try {\n return JSON.stringify(output, null, 2)\n } catch {\n return String(output)\n }\n}\n","/**\n * Runs a deployed agent through `POST /api/workflows/:id/execute` and normalises its\n * server-sent events. The platform emits two shapes depending on the run mode — the\n * executor's typed events (`stream:chunk`, `block:completed`, `execution:completed`, …)\n * and the streaming-response shape shared with chat (`{ blockId, chunk }`, `{ event:\n * 'final', data }`) — and both are folded into one small event vocabulary here.\n */\nimport { type AginiesClient, AginiesError } from '../client'\n\nexport type RunEvent =\n | { type: 'started'; executionId?: string }\n | { type: 'chunk'; blockId?: string; text: string }\n | {\n type: 'step'\n blockId: string\n name: string\n status: 'running' | 'done' | 'error'\n durationMs?: number\n }\n | { type: 'done'; output: unknown; success: boolean }\n | { type: 'error'; message: string }\n\nexport interface RunOptions {\n /** An `execute`-scoped API key. It is visible to the browser: scope it to this agent only. */\n apiKey: string\n /** Free-form or structured input for the agent's start block. */\n input?: unknown\n /** Outputs to stream, as `blockId_path` or `Block name.path`. */\n selectedOutputs?: string[]\n}\n\nexport async function* runAgent(\n client: AginiesClient,\n workflowId: string,\n options: RunOptions,\n signal?: AbortSignal\n): AsyncGenerator<RunEvent> {\n const res = await client.fetchRaw(`/api/workflows/${encodeURIComponent(workflowId)}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': options.apiKey,\n 'X-Stream-Response': 'true',\n },\n credentials: 'omit',\n body: JSON.stringify({\n input: options.input,\n stream: true,\n triggerType: 'api',\n selectedOutputs: options.selectedOutputs,\n }),\n signal,\n })\n const executionId = res.headers.get('X-Execution-Id') ?? undefined\n if (!res.ok) {\n let message = `HTTP ${res.status}`\n try {\n const body = (await res.json()) as { error?: string }\n if (body.error) message = body.error\n } catch {\n /* body was not JSON */\n }\n throw new AginiesError(message, res.status, res.status === 401 ? 'UNAUTHORIZED' : undefined)\n }\n yield { type: 'started', executionId }\n const contentType = res.headers.get('content-type') ?? ''\n if (!contentType.includes('text/event-stream')) {\n const body = (await res.json()) as { success?: boolean; output?: unknown; error?: string }\n if (body.success === false) yield { type: 'error', message: body.error ?? 'Run failed' }\n else yield { type: 'done', output: body.output ?? body, success: true }\n return\n }\n yield* parseRunSSE(res.body as ReadableStream<Uint8Array>)\n}\n\n/** Decodes an execute SSE body into run events. Exported for tests. */\nexport async function* parseRunSSE(stream: ReadableStream<Uint8Array>): AsyncGenerator<RunEvent> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let finished = false\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n let sep = buffer.indexOf('\\n\\n')\n while (sep !== -1) {\n const ev = decodeRunFrame(buffer.slice(0, sep))\n buffer = buffer.slice(sep + 2)\n if (ev) {\n if (ev.type === 'done' || ev.type === 'error') finished = true\n yield ev\n }\n sep = buffer.indexOf('\\n\\n')\n }\n }\n const tail = decodeRunFrame(buffer)\n if (tail) {\n if (tail.type === 'done' || tail.type === 'error') finished = true\n yield tail\n }\n } finally {\n reader.releaseLock()\n }\n if (!finished) yield { type: 'done', output: null, success: true }\n}\n\nfunction decodeRunFrame(frame: string): RunEvent | null {\n const line = frame.split('\\n').find((l) => l.startsWith('data:'))\n if (!line) return null\n const data = line.slice(5).trim()\n if (!data || data === '[DONE]') return null\n let json: Record<string, unknown>\n try {\n json = JSON.parse(data)\n } catch {\n return { type: 'chunk', text: data }\n }\n const d = (json.data ?? {}) as Record<string, unknown>\n switch (json.type) {\n case 'stream:chunk':\n return { type: 'chunk', blockId: d.blockId as string, text: String(d.chunk ?? '') }\n case 'block:started':\n return {\n type: 'step',\n blockId: String(d.blockId),\n name: String(d.blockName ?? d.blockType ?? ''),\n status: 'running',\n }\n case 'block:completed':\n return {\n type: 'step',\n blockId: String(d.blockId),\n name: String(d.blockName ?? d.blockType ?? ''),\n status: 'done',\n durationMs: d.durationMs as number | undefined,\n }\n case 'block:error':\n return {\n type: 'step',\n blockId: String(d.blockId),\n name: String(d.blockName ?? d.blockType ?? ''),\n status: 'error',\n durationMs: d.durationMs as number | undefined,\n }\n case 'execution:completed':\n return { type: 'done', output: d.output, success: d.success !== false }\n case 'execution:error':\n return { type: 'error', message: String(d.error ?? 'Run failed') }\n case 'execution:cancelled':\n return { type: 'error', message: 'Run cancelled' }\n case 'execution:started':\n case 'stream:done':\n return null\n }\n // streaming-response shape\n if (json.event === 'error') return { type: 'error', message: String(json.error ?? 'Run failed') }\n if (json.event === 'final') {\n const fd = (json.data ?? {}) as { success?: boolean; output?: unknown; error?: unknown }\n if (fd.success === false) {\n const err = fd.error\n return {\n type: 'error',\n message:\n typeof err === 'string' ? err : ((err as { message?: string })?.message ?? 'Run failed'),\n }\n }\n return { type: 'done', output: fd.output ?? fd, success: true }\n }\n if (typeof json.chunk === 'string')\n return { type: 'chunk', blockId: json.blockId as string | undefined, text: json.chunk }\n return null\n}\n"],"mappings":";;;AAoGO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC7B;AAAA,EACA;AAAA,EACT,YAAY,SAAiB,QAAgB,MAAe;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,YAAY,CAAC,MAAc,EAAE,QAAQ,QAAQ,EAAE;AAE9C,IAAM,gBAAN,MAAoB;AAAA,EAChB;AAAA,EACA;AAAA,EACQ;AAAA,EACR;AAAA,EACQ;AAAA,EACT,QAAyB,EAAE,QAAQ,OAAO;AAAA,EAC1C,YAAY,oBAAI,IAAkC;AAAA,EAClD,aAA8C;AAAA,EAC9C,UAAoC;AAAA,EAE5C,YAAY,QAAuB;AACjC,QAAI,CAAC,QAAQ,QAAS,OAAM,IAAI,aAAa,uBAAuB,GAAG,kBAAkB;AACzF,QAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,QAAQ;AACrC,YAAM,IAAI,aAAa,qBAAqB,GAAG,eAAe;AAAA,IAChE;AACA,SAAK,UAAU,UAAU,OAAO,OAAO;AACvC,SAAK,QAAQ,OAAO,SAAS;AAC7B,SAAK,SAAS,OAAO,WAAW;AAChC,SAAK,SAAS,OAAO,UAAU,aAAa;AAC5C,SAAK,YAAY,OAAO,UAAU,IAAI,SAAS,MAAM,GAAG,IAAI;AAAA,EAC9D;AAAA,EAEA,WAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,UAAoD;AAC5D,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEQ,SAAS,MAAuB;AACtC,SAAK,QAAQ;AACb,eAAW,KAAK,KAAK,UAAW,GAAE,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAqC;AACnC,QAAI,KAAK,WAAY,QAAO,KAAK;AACjC,SAAK,SAAS,EAAE,QAAQ,aAAa,CAAC;AACtC,SAAK,cAAc,YAAY;AAC7B,UAAI;AACF,cAAM,MAAM,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,oBAAoB;AAAA,UAClE,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,KAAK,SAAS,EAAE,QAAQ,KAAK,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;AAAA,QAC7E,CAAC;AACD,YAAI,CAAC,IAAI,IAAI;AACX,gBAAMA,QAAO,MAAM,SAAS,GAAG;AAC/B,gBAAM,SAAUA,SAASA,MAAK,SAAqB,QAAQ,IAAI,MAAM;AACrE,eAAK,SAAS,EAAE,QAAQ,YAAY,OAAO,CAAC;AAC5C,iBAAO,KAAK;AAAA,QACd;AACA,cAAM,OAAQ,MAAM,IAAI,KAAK;AAK7B,YAAI,CAAC,KAAK,aAAa,CAAC,KAAK,QAAQ;AACnC,eAAK,SAAS,EAAE,QAAQ,YAAY,QAAQ,qBAAqB,CAAC;AAClE,iBAAO,KAAK;AAAA,QACd;AACA,aAAK,UAAU,KAAK,WAAW;AAC/B,aAAK,SAAS,EAAE,QAAQ,UAAU,QAAQ,KAAK,OAAO,CAAC;AACvD,eAAO,KAAK;AAAA,MACd,SAAS,KAAK;AACZ,aAAK,SAAS;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ,eAAe,QAAQ,IAAI,UAAU;AAAA,QAC/C,CAAC;AACD,eAAO,KAAK;AAAA,MACd;AAAA,IACF,GAAG;AACH,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,eAAe;AACrB,QAAI,KAAK,MAAM,WAAW,UAAU;AAClC,YAAM,IAAI,aAAa,2BAA2B,GAAG,eAAe;AAAA,IACtE;AAAA,EACF;AAAA;AAAA,EAGA,aAAuC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,UAAU,QAAyB;AACjC,QAAI,KAAK,MAAM,WAAW,SAAU,QAAO;AAC3C,UAAM,UAAU,KAAK,MAAM,OAAO,WAAW,CAAC;AAC9C,WAAO,QAAQ,WAAW,KAAK,QAAQ,SAAS,MAAM;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,eAAiC;AAC7C,SAAK,aAAa;AAClB,UAAM,QAAQ,MAAM,KAAK,SAAS;AAClC,WAAO,MAAM,WAAW,YAAY,KAAK,YAAY;AAAA,EACvD;AAAA,EAEQ,YAAYC,OAAgC;AAClD,QAAI,CAAC,KAAK,QAAS,QAAOA;AAC1B,UAAM,UAAU,IAAI,QAAQA,MAAK,WAAW,CAAC,CAAC;AAC9C,QAAI,CAAC,QAAQ,IAAI,eAAe,EAAG,SAAQ,IAAI,iBAAiB,UAAU,KAAK,QAAQ,KAAK,EAAE;AAC9F,WAAO,EAAE,GAAGA,OAAM,QAAQ;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,QAAQC,OAAcD,QAAoB,CAAC,GAAsB;AAC7E,UAAM,MAAM,GAAG,KAAK,OAAO,GAAGC,MAAK,WAAW,GAAG,IAAIA,QAAO,IAAIA,KAAI,EAAE;AACtE,UAAM,OAAO,MAAM,KAAK,UAAU,KAAK,KAAK,YAAY,EAAE,aAAa,WAAW,GAAGD,MAAK,CAAC,CAAC;AAC5F,QAAI,MAAM,MAAM,KAAK;AACrB,QACE,KAAK,YACJ,IAAI,WAAW,OAAO,IAAI,WAAW,QACtC,KAAK,QAAQ,YAAY,OAAQ,KAAK,IAAI,IAAI,KAC9C;AACA,UAAI,MAAM,KAAK,aAAa,EAAG,OAAM,MAAM,KAAK;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAASC,OAAcD,QAAoB,CAAC,GAAsB;AAChE,SAAK,aAAa;AAClB,WAAO,KAAK,QAAQC,OAAMD,KAAI;AAAA,EAChC;AAAA;AAAA,EAGA,MAAM,WACJ,YACA,OACA,WAAW,aACX,UACwB;AACxB,SAAK,aAAa;AAClB,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,OAAO,QAAQ,OAAO,QAAQ;AACnC,QAAI,SAAU,MAAK,OAAO,YAAY,QAAQ;AAC9C,UAAM,MAAM,MAAM,KAAK,QAAQ,aAAa,mBAAmB,UAAU,CAAC,qBAAqB;AAAA,MAC7F,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,MAAM,WAAW,GAAG;AACvC,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,MAAM,YAAoB,MAA6B;AAC3D,SAAK,aAAa;AAClB,UAAM,MAAM,MAAM,KAAK,QAAQ,aAAa,mBAAmB,UAAU,CAAC,gBAAgB;AAAA,MACxF,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,IAC/B,CAAC;AACD,QAAI,CAAC,IAAI,GAAI,OAAM,MAAM,WAAW,GAAG;AACvC,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,QAAQ,YAA4D;AACxE,SAAK,aAAa;AAClB,UAAM,MAAM,MAAM,KAAK,QAAQ,aAAa,mBAAmB,UAAU,CAAC,EAAE;AAC5E,UAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,QAAI,IAAI,WAAW,OAAO,QAAQ,OAAO,KAAK,iBAAiB,UAAU;AACvE,aAAO;AAAA,IACT;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,aAAc,MAAM,SAAoB,QAAQ,IAAI,MAAM,IAAI,IAAI,MAAM;AAAA,IACpF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,YACL,YACA,OACA,QACiC;AACjC,SAAK,aAAa;AAClB,UAAM,MAAM,MAAM,KAAK,QAAQ,aAAa,mBAAmB,UAAU,CAAC,IAAI;AAAA,MAC5E,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,KAAK;AAAA,MAC1B;AAAA,IACF,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,UAAI,IAAI,WAAW,OAAO,QAAQ,OAAO,KAAK,iBAAiB,UAAU;AACvE,cAAM,IAAI,aAAa,2BAA2B,KAAK,eAAe;AAAA,MACxE;AACA,YAAM,IAAI,aAAc,MAAM,SAAoB,QAAQ,IAAI,MAAM,IAAI,IAAI,MAAM;AAAA,IACpF;AACA,UAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,QAAI,CAAC,YAAY,SAAS,mBAAmB,GAAG;AAC9C,YAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,YAAM,EAAE,MAAM,SAAS,MAAM,KAAK;AAClC,YAAM,EAAE,MAAM,OAAO;AACrB;AAAA,IACF;AACA,WAAO,SAAS,IAAI,IAAkC;AAAA,EACxD;AACF;AAGA,gBAAuB,SACrB,QACiC;AACjC,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AACb,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAI,MAAM,OAAO,QAAQ,MAAM;AAC/B,aAAO,QAAQ,IAAI;AACjB,cAAM,QAAQ,OAAO,MAAM,GAAG,GAAG;AACjC,iBAAS,OAAO,MAAM,MAAM,CAAC;AAC7B,cAAM,QAAQ,YAAY,KAAK;AAC/B,YAAI,MAAO,OAAM;AACjB,cAAM,OAAO,QAAQ,MAAM;AAAA,MAC7B;AAAA,IACF;AACA,UAAM,OAAO,YAAY,MAAM;AAC/B,QAAI,KAAM,OAAM;AAAA,EAClB,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACA,QAAM,EAAE,MAAM,OAAO;AACvB;AAEA,SAAS,YAAY,OAAuC;AAC1D,QAAM,OAAO,MAAM,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AAChE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,MAAI,CAAC,QAAQ,SAAS,SAAU,QAAO;AACvC,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO,EAAE,MAAM,SAAS,MAAM,KAAK;AAAA,EACrC;AACA,MAAI,KAAK,UAAU,SAAS;AAC1B,WAAO,EAAE,MAAM,SAAS,SAAU,KAAK,SAAoB,eAAe;AAAA,EAC5E;AACA,MAAI,KAAK,UAAU,SAAS;AAC1B,WAAO,EAAE,MAAM,SAAS,MAAM,KAAK,KAAK;AAAA,EAC1C;AACA,MAAI,OAAO,KAAK,UAAU,UAAU;AAClC,WAAO,EAAE,MAAM,SAAS,SAAS,KAAK,SAA+B,MAAM,KAAK,MAAM;AAAA,EACxF;AACA,SAAO;AACT;AAEA,eAAe,WAAW,KAAsC;AAC9D,QAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,MAAI,IAAI,WAAW,OAAO,QAAQ,OAAO,KAAK,iBAAiB,UAAU;AACvE,WAAO,IAAI,aAAa,2BAA2B,KAAK,eAAe;AAAA,EACzE;AACA,MAAI,IAAI,WAAW;AACjB,WAAO,IAAI,aAAa,0BAA0B,KAAK,mBAAmB;AAC5E,SAAO,IAAI,aAAc,MAAM,SAAoB,QAAQ,IAAI,MAAM,IAAI,IAAI,MAAM;AACrF;AAEA,eAAe,SAAS,KAAwD;AAC9E,MAAI;AACF,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAA4B;AACnC,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,OAAO,SAAS,gBAAgB,MAAM,YAAY,KAAK;AAC7D,QAAI,KAAK,WAAW,IAAI,EAAG,QAAO;AAAA,EACpC;AACA,MAAI,OAAO,cAAc,eAAe,UAAU,UAAU,YAAY,EAAE,WAAW,IAAI,GAAG;AAC1F,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC7UA,IAAM,OAAO,CAAC,YAAoB,aAAqB,cACrD,eAAe,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,WAAW,CAAC,GAC9E,YAAY,IAAI,mBAAmB,SAAS,CAAC,KAAK,EACpD;AAEF,eAAe,SAAY,KAA2B;AACpD,MAAI,OAAgB;AACpB,MAAI;AACF,WAAO,MAAM,IAAI,KAAK;AAAA,EACxB,QAAQ;AAAA,EAER;AACA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,QAAS,MAAoC;AACnD,UAAM,IAAI;AAAA,MACR,SAAS,QAAQ,IAAI,MAAM;AAAA,MAC3B,IAAI;AAAA,MACJ,IAAI,WAAW,MAAM,cAAc,IAAI,WAAW,MAAM,cAAc;AAAA,IACxE;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBACd,QACA,YACA,aAC0B;AAC1B,SAAO,OAAO,SAAS,KAAK,YAAY,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,SAA0B,CAAC,CAAC;AAChG;AAEO,SAAS,gBACd,QACA,YACA,aACA,WACuB;AACvB,SAAO,OACJ,SAAS,KAAK,YAAY,aAAa,SAAS,CAAC,EACjD,KAAK,CAAC,MAAM,SAAuB,CAAC,CAAC;AAC1C;AAEO,SAAS,qBACd,QACA,YACA,QAC4B;AAC5B,QAAM,QAAQ,SAAS,WAAW,mBAAmB,MAAM,CAAC,KAAK;AACjE,SAAO,OACJ,SAAS,kBAAkB,mBAAmB,UAAU,CAAC,UAAU,KAAK,EAAE,EAC1E,KAAK,CAAC,MAAM,SAAkD,CAAC,CAAC,EAChE,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AACzC;AAGO,SAAS,gBACd,QACA,YACA,aACA,WACA,YACwB;AACxB,SAAO,OACJ,SAAS,KAAK,YAAY,aAAa,SAAS,GAAG;AAAA,IAClD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;AAAA,EAClE,CAAC,EACA,KAAK,CAAC,MAAM,SAAwB,CAAC,CAAC;AAC3C;AAKO,SAAS,SAAS,OAAqD;AAC5E,QAAM,MAAM,OAAO,UAAU,MAAM;AACnC,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,SAAO,IACJ,IAAI,CAAC,GAAG,UAA8B;AACrC,QAAI,CAAC,KAAK,OAAO,MAAM,SAAU,QAAO;AACxC,UAAM,QAAQ;AACd,UAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,KAAK,KAAK,IAAI;AAClE,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,MAAM,CAAC,MAAgB,OAAO,MAAM,YAAY,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI;AAC5E,WAAO;AAAA,MACL,IAAI,IAAI,MAAM,EAAE,KAAK,SAAS,KAAK;AAAA,MACnC;AAAA,MACA,OAAO,IAAI,MAAM,KAAK,KAAK;AAAA,MAC3B,MAAM,IAAI,MAAM,IAAI,KAAK;AAAA,MACzB,aAAa,IAAI,MAAM,WAAW;AAAA,MAClC,aAAa,IAAI,MAAM,WAAW;AAAA,MAClC,OAAO,MAAM;AAAA,MACb,UAAU,MAAM,aAAa;AAAA,MAC7B,SAAS,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,UAAU;AAAA,MACxD,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,IACtD;AAAA,EACF,CAAC,EACA,OAAO,CAAC,MAAwB,MAAM,IAAI;AAC/C;AAGO,SAAS,SAAS,OAA+D;AACtF,QAAM,OAAO,OAAO,UAAU;AAC9B,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO,CAAC;AAC/C,QAAM,EAAE,aAAa,IAAI,aAAa,IAAI,GAAG,KAAK,IAAI;AACtD,SAAO;AACT;AAGO,SAAS,iBAAiB,OAAoB,OAAwB;AAC3E,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,UAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AACxD,UAAI,OAAO,UAAU,YAAY,CAAC,QAAQ,OAAO,EAAE,SAAS,MAAM,KAAK,EAAE,YAAY,CAAC;AACpF,eAAO,MAAM,KAAK,EAAE,YAAY;AAClC,aAAO;AAAA,IACT,KAAK;AACH,aAAO,OAAO,UAAU,WACpB,OAAO,SAAS,KAAK,IACnB,OAAO,KAAK,IACZ,KACF,OAAO,KAAK;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,OAAO,UAAU,SAAU,QAAO;AACtC,UAAI;AACF,eAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,MACtC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACE,aAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AAAA,EACnE;AACF;AAGO,SAAS,gBACd,OACA,KACgD;AAChD,QAAM,OAAO,IAAI,KAAK;AACtB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,OAAO,SAAS,OAAO;AAAA,IAClC,KAAK,UAAU;AACb,YAAM,IAAI,OAAO,IAAI;AACrB,aAAO,OAAO,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,SAAS;AAAA,IAC/D;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI;AACF,eAAO,EAAE,OAAO,KAAK,MAAM,IAAI,EAAE;AAAA,MACnC,QAAQ;AACN,eAAO,EAAE,OAAO,OAAO;AAAA,MACzB;AAAA,IACF;AACE,aAAO,EAAE,OAAO,IAAI;AAAA,EACxB;AACF;AAGO,SAAS,cAAc,QAA+C;AAC3E,SAAO,OAAO,YAAY,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,iBAAiB,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AACrF;AAMO,SAAS,gBACd,QACA,QACiG;AACjG,QAAM,aAAsC,CAAC;AAC7C,QAAM,SAAyD,CAAC;AAChE,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,OAAO,MAAM,IAAI,KAAK;AAClC,UAAM,UAAU,MAAM,SAAS,YAAY,QAAQ,UAAU,QAAQ,UAAU,IAAI,KAAK,MAAM;AAC9F,QAAI,CAAC,SAAS;AACZ,UAAI,MAAM,SAAU,QAAO,MAAM,IAAI,IAAI;AACzC;AAAA,IACF;AACA,UAAM,EAAE,OAAO,MAAM,IAAI,gBAAgB,OAAO,GAAG;AACnD,QAAI,MAAO,QAAO,MAAM,IAAI,IAAI;AAAA,aACvB,UAAU,OAAW,YAAW,MAAM,IAAI,IAAI;AAAA,EACzD;AACA,SAAO,EAAE,YAAY,OAAO;AAC9B;;;AC5QA,SAAyB,aAAa,aAAAE,YAAW,WAAAC,UAAS,QAAQ,YAAAC,iBAAgB;;;ACMlF,SAAS,kBAAkB;AAoBvB,cA6DA,YA7DA;AAjBG,SAAS,MAAM,OAAyD;AAC7E,SAAO,MAAM,OAAO,OAAO,EAAE,KAAK,GAAG;AACvC;AAUO,IAAM,SAAS,WAA2C,SAASC,QACxE,EAAE,UAAU,WAAW,OAAO,MAAM,WAAW,OAAO,UAAU,GAAG,MAAM,GACzE,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,GAAG,WAAW,YAAY,OAAO,IAAI,YAAY,IAAI,IAAI,SAAS;AAAA,MAC5E,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAQM,SAAS,IAAI,EAAE,OAAO,WAAW,WAAW,GAAG,MAAM,GAAa;AACvE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,WAAW,SAAS,aAAa,YAAY,IAAI,IAAI,SAAS;AAAA,MAC3E,GAAG;AAAA;AAAA,EACN;AAEJ;AAMO,SAAS,KAAK,EAAE,UAAU,OAAO,WAAW,OAAO,UAAU,GAAG,MAAM,GAAc;AACzF,SACE,oBAAC,YAAO,MAAY,gBAAc,SAAS,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAAO;AAEhG;AAQO,SAAS,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAe;AACpE,SAAO,oBAAC,SAAI,WAAW,GAAG,aAAa,UAAU,KAAK,gBAAgB,SAAS,GAAI,GAAG,OAAO;AAC/F;AAIO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+D;AAC7D,SAAO,oBAAC,OAAE,WAAW,GAAG,eAAe,SAAS,sBAAsB,SAAS,GAAI,GAAG,OAAO;AAC/F;AAOO,SAAS,KAAK,EAAE,OAAO,OAAO,WAAW,GAAG,MAAM,GAAc;AACrE,SACE,qBAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAC7C;AAAA,wBAAC,SAAI,WAAU,eAAe,iBAAM;AAAA,IACpC,oBAAC,SAAI,WAAU,eAAe,iBAAM;AAAA,KACtC;AAEJ;AAYO,SAAS,MAAM,EAAE,OAAO,MAAM,OAAO,WAAW,UAAU,GAAG,MAAM,GAAe;AACvF;AAAA;AAAA,IAEE,qBAAC,WAAM,WAAW,GAAG,aAAa,SAAS,GAAI,GAAG,OAChD;AAAA,0BAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA,MACzC;AAAA,MACA,QACC,oBAAC,UAAK,WAAU,oBAAoB,iBAAM,IAE1C,QAAQ,oBAAC,UAAK,WAAU,mBAAmB,gBAAK;AAAA,OAEpD;AAAA;AAEJ;AAEO,IAAM,QAAQ;AAAA,EACnB,SAASC,OAAM,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AAC3C,WAAO,oBAAC,WAAM,KAAU,WAAW,GAAG,aAAa,SAAS,GAAI,GAAG,OAAO;AAAA,EAC5E;AACF;AAEO,IAAM,WAAW,WAGtB,SAASC,UAAS,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AAChD,SAAO,oBAAC,cAAS,KAAU,WAAW,GAAG,aAAa,gBAAgB,SAAS,GAAI,GAAG,OAAO;AAC/F,CAAC;AAIM,SAAS,QAAQ,EAAE,WAAW,MAAM,GAA2C;AACpF,SACE,qBAAC,YAAO,WAAW,GAAG,eAAe,SAAS,GAAG,cAAY,OAC3D;AAAA,wBAAC,UAAK;AAAA,IACN,oBAAC,UAAK;AAAA,IACN,oBAAC,UAAK;AAAA,KACR;AAEJ;;;AC9IA,SAAS,eAA+B,YAAY,WAAW,SAAS,gBAAgB;;;ACExF,IAAM,UAAU;AAAA,EACd,MAAM;AAAA,IACJ,MAAM,EAAE,IAAI,iBAAc,IAAI,YAAY;AAAA,IAC1C,OAAO,EAAE,IAAI,SAAS,IAAI,QAAQ;AAAA,IAClC,aAAa,EAAE,IAAI,8CAAqB,IAAI,0BAAqB;AAAA,IACjE,MAAM,EAAE,IAAI,aAAU,IAAI,OAAO;AAAA,IACjC,MAAM,EAAE,IAAI,UAAU,IAAI,OAAO;AAAA,IACjC,QAAQ,EAAE,IAAI,cAAc,IAAI,cAAc;AAAA,IAC9C,aAAa,EAAE,IAAI,SAAS,IAAI,cAAc;AAAA,IAC9C,YAAY,EAAE,IAAI,4BAAkB,IAAI,cAAc;AAAA,IACtD,cAAc,EAAE,IAAI,sCAAsC,IAAI,gCAAgC;AAAA,IAC9F,cAAc;AAAA,MACZ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,UAAU,EAAE,IAAI,qCAAsB,IAAI,gBAAgB;AAAA,IAC1D,SAAS,EAAE,IAAI,0BAAqB,IAAI,oBAAoB;AAAA,IAC5D,OAAO;AAAA,MACL,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,aAAa;AAAA,MACX,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,WAAW,EAAE,IAAI,eAAe,IAAI,qBAAqB;AAAA,IACzD,KAAK,EAAE,IAAI,OAAO,IAAI,MAAM;AAAA,IAC5B,WAAW,EAAE,IAAI,QAAQ,IAAI,QAAQ;AAAA,EACvC;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,IAAI,kCAA6B,IAAI,kCAAkC;AAAA,IACxF,cAAc,EAAE,IAAI,4CAAoC,IAAI,kCAAkC;AAAA,IAC9F,UAAU,EAAE,IAAI,UAAU,IAAI,WAAW;AAAA,IACzC,YAAY,EAAE,IAAI,8BAAyB,IAAI,0BAA0B;AAAA,IACzE,WAAW;AAAA,MACT,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,OAAO,EAAE,IAAI,WAAW,IAAI,SAAS;AAAA,IACrC,MAAM,EAAE,IAAI,uBAAkB,IAAI,oBAAoB;AAAA,IACtD,UAAU;AAAA,MACR,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,UAAU,EAAE,IAAI,YAAY,IAAI,WAAW;AAAA,IAC3C,UAAU,EAAE,IAAI,iBAAc,IAAI,YAAY;AAAA,IAC9C,QAAQ,EAAE,IAAI,gBAAW,IAAI,SAAS;AAAA,IACtC,MAAM,EAAE,IAAI,QAAQ,IAAI,OAAO;AAAA,IAC/B,iBAAiB,EAAE,IAAI,4BAAkB,IAAI,kBAAkB;AAAA,IAC/D,cAAc;AAAA,MACZ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,aAAa;AAAA,MACX,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,UAAU,EAAE,IAAI,sBAAmB,IAAI,aAAa;AAAA,IACpD,WAAW;AAAA,MACT,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,QAAQ,EAAE,IAAI,0BAAuB,IAAI,cAAc;AAAA,IACvD,UAAU,EAAE,IAAI,+BAA0B,IAAI,iCAAiC;AAAA,IAC/E,SAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,WAAW,EAAE,IAAI,uBAAkB,IAAI,UAAU;AAAA,EACnD;AAAA,EACA,OAAO;AAAA,IACL,MAAM,EAAE,IAAI,iCAAyB,IAAI,cAAc;AAAA,IACvD,aAAa,EAAE,IAAI,4BAAyB,IAAI,gBAAgB;AAAA,IAChE,SAAS,EAAE,IAAI,aAAa,IAAI,UAAU;AAAA,IAC1C,WAAW,EAAE,IAAI,gBAAgB,IAAI,qBAAqB;AAAA,IAC1D,MAAM,EAAE,IAAI,+BAAuB,IAAI,2BAA2B;AAAA,IAClE,WAAW,EAAE,IAAI,YAAY,IAAI,YAAY;AAAA,IAC7C,cAAc,EAAE,IAAI,kCAAoB,IAAI,eAAe;AAAA,IAC3D,UAAU,EAAE,IAAI,qCAAsB,IAAI,gBAAgB;AAAA,IAC1D,UAAU,EAAE,IAAI,kBAAa,IAAI,WAAW;AAAA,IAC5C,MAAM,EAAE,IAAI,cAAS,IAAI,QAAQ;AAAA,IACjC,WAAW,EAAE,IAAI,0CAA8B,IAAI,mBAAmB;AAAA,IACtE,WAAW;AAAA,MACT,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,aAAa;AAAA,MACX,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,aAAa;AAAA,MACX,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,QAAQ,EAAE,IAAI,8BAAY,IAAI,MAAM;AAAA,IACpC,QAAQ,EAAE,IAAI,cAAS,IAAI,SAAS;AAAA,IACpC,SAAS,EAAE,IAAI,+BAAa,IAAI,UAAU;AAAA,IAC1C,MAAM,EAAE,IAAI,mBAAc,IAAI,YAAY;AAAA,IAC1C,OAAO,EAAE,IAAI,QAAQ,IAAI,QAAQ;AAAA,IACjC,QAAQ,EAAE,IAAI,+DAA8B,IAAI,kBAAkB;AAAA,IAClE,cAAc,EAAE,IAAI,iCAA4B,IAAI,4BAA4B;AAAA,IAChF,OAAO,EAAE,IAAI,gBAAW,IAAI,QAAQ;AAAA,IACpC,WAAW,EAAE,IAAI,gCAAc,IAAI,YAAY;AAAA,EACjD;AAAA,EACA,UAAU;AAAA,IACR,SAAS,EAAE,IAAI,yBAAe,IAAI,iBAAiB;AAAA,IACnD,OAAO,EAAE,IAAI,2BAAsB,IAAI,iCAAiC;AAAA,IACxE,WAAW,EAAE,IAAI,gCAAc,IAAI,YAAY;AAAA,IAC/C,UAAU,EAAE,IAAI,0BAAgB,IAAI,SAAS;AAAA,IAC7C,QAAQ,EAAE,IAAI,uBAAkB,IAAI,kBAAkB;AAAA,IACtD,OAAO,EAAE,IAAI,SAAS,IAAI,QAAQ;AAAA,IAClC,QAAQ,EAAE,IAAI,0BAAkB,IAAI,0BAA0B;AAAA,IAC9D,eAAe,EAAE,IAAI,aAAQ,IAAI,iBAAiB;AAAA,IAClD,QAAQ,EAAE,IAAI,sBAAsB,IAAI,uBAAuB;AAAA,IAC/D,YAAY,EAAE,IAAI,mBAAgB,IAAI,aAAa;AAAA,IACnD,SAAS,EAAE,IAAI,UAAU,IAAI,UAAU;AAAA,IACvC,UAAU,EAAE,IAAI,oBAAoB,IAAI,0BAA0B;AAAA,IAClE,YAAY,EAAE,IAAI,oBAAe,IAAI,kBAAkB;AAAA,IACvD,SAAS,EAAE,IAAI,0BAAuB,IAAI,oBAAoB;AAAA,IAC9D,UAAU;AAAA,MACR,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,WAAW,EAAE,IAAI,wBAAqB,IAAI,oCAAoC;AAAA,IAC9E,aAAa,EAAE,IAAI,uBAAuB,IAAI,gCAAgC;AAAA,IAC9E,gBAAgB;AAAA,MACd,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,eAAe;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,QAAQ,EAAE,IAAI,iBAAiB,IAAI,oBAAoB;AAAA,IACvD,QAAQ,EAAE,IAAI,eAAU,IAAI,SAAS;AAAA,IACrC,UAAU,EAAE,IAAI,gBAAgB,IAAI,WAAW;AAAA,IAC/C,SAAS,EAAE,IAAI,cAAc,IAAI,UAAU;AAAA,IAC3C,QAAQ,EAAE,IAAI,4BAAa,IAAI,SAAS;AAAA,EAC1C;AAAA,EACA,QAAQ;AAAA,IACN,SAAS,EAAE,IAAI,iBAAc,IAAI,UAAU;AAAA,IAC3C,OAAO,EAAE,IAAI,eAAe,IAAI,QAAQ;AAAA,IACxC,cAAc;AAAA,MACZ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,EACF;AACF;AAMO,SAAS,WAAW,QAAgB;AACzC,SAAO,SAAS,EAAqB,SAAY,KAAqB;AACpE,UAAM,QAAQ,QAAQ,OAAO,EAAE,GAAG;AAClC,WAAO,MAAM,MAAM,KAAK,MAAM;AAAA,EAChC;AACF;;;AD9EuE,0BAAAC,YAAA;AAxFvE,IAAI,gBAAsC;AAMnC,SAAS,KAAK,QAAsC;AACzD,kBAAgB,IAAI,cAAc,MAAM;AACxC,OAAK,cAAc,SAAS;AAC5B,SAAO;AACT;AAGO,SAAS,YAAkC;AAChD,SAAO;AACT;AASA,IAAM,iBAAiB,cAA0C,IAAI;AAM9D,SAAS,UAAU,QAAyB;AACjD,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,UAAU,OAAO,UAAU,MAAM;AACvC,YAAU,MAAM;AACd,QAAI,CAAC,WAAW,OAAO,YAAY,aAAa;AAC9C,cAAQ,KAAK,kBAAkB,MAAM,iDAAiD;AAAA,IACxF;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,CAAC;AACpB,SAAO;AACT;AAiBO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAyB;AACvB,QAAM,WAAW,UAAU;AAC3B,QAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,IACxB,UAAU,SAAS,KAAK,EAAE,QAAQ,YAAY,QAAQ,wBAAwB;AAAA,EAChF;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,aAAS,SAAS,SAAS,CAAC;AAC5B,UAAM,cAAc,SAAS,UAAU,QAAQ;AAC/C,SAAK,SAAS,SAAS;AACvB,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,CAAC;AAEb,YAAU,MAAM;AACd,QAAI,MAAM,WAAW,cAAc,OAAO,YAAY,aAAa;AACjE,cAAQ,KAAK,mCAAmC,MAAM,MAAM,EAAE;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,QAAQ,QAAoC,MAAM;AACtD,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,IAAI,UAAU,SAAS;AAC7B,WAAO,EAAE,QAAQ,UAAU,OAAO,QAAQ,GAAG,GAAG,WAAW,CAAC,EAAE;AAAA,EAChE,GAAG,CAAC,UAAU,OAAO,MAAM,CAAC;AAE5B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,WAAW,UAAU,MAAM,WAAW,aAAc,QAAO,gBAAAA,KAAA,YAAG,oBAAS;AACjF,MAAI,MAAM,WAAW,WAAY,QAAO;AACxC,SAAO,gBAAAA,KAAC,eAAe,UAAf,EAAwB,OAAe,UAAS;AAC1D;AAGO,SAAS,aAAkC;AAChD,QAAM,MAAM,WAAW,cAAc;AACrC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC3F;AACA,SAAO;AACT;;;AFwHQ,SAQM,YAAAC,WARN,OAAAC,MAQM,QAAAC,aARN;AAlMD,SAAS,YAAY,YAAoB,aAAqB,WAAoB;AACvF,QAAM,EAAE,QAAQ,EAAE,IAAI,WAAW;AACjC,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAyB,SAAS;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAiC,IAAI;AACvE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAwB,aAAa,IAAI;AACzE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiC,CAAC,CAAC;AAC/D,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiC,CAAC,CAAC;AAC/D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA+B,IAAI;AACjE,QAAM,cAAc,OAAsB,aAAa,IAAI;AAE3D,QAAM,aAAgCC,SAAQ,MAAM;AAClD,QAAI,CAAC,UAAW,QAAO;AACvB,WACE,UAAU,YAAY,KAAK,CAAC,MAAM,EAAE,cAAc,QAAQ,KAC1D,UAAU,YAAY,KAAK,CAAC,MAAM,EAAE,iBAAiB,QAAQ,KAC7D,UAAU,YAAY,CAAC,KACvB;AAAA,EAEJ,GAAG,CAAC,WAAW,QAAQ,CAAC;AAExB,QAAM,SAAwBA,SAAQ,MAAM,SAAS,UAAU,GAAG,CAAC,UAAU,CAAC;AAE9E,QAAM,OAAO,YAAY,YAAY;AACnC,cAAU,SAAS;AACnB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB,QAAQ,YAAY,WAAW;AACvE,mBAAa,MAAM;AACnB,YAAM,SAAS,aAAa,YAAY;AACxC,YAAM,QACJ,OAAO,YAAY,KAAK,CAAC,MAAM,EAAE,cAAc,MAAM,KACrD,OAAO,YAAY,KAAK,CAAC,MAAM,EAAE,iBAAiB,QAAQ,KAC1D,OAAO,YAAY,CAAC;AACtB,UAAI,OAAO;AACT,oBAAY,UAAU,MAAM;AAC5B,oBAAY,MAAM,SAAS;AAC3B,kBAAU,cAAc,SAAS,KAAK,CAAC,CAAC;AAAA,MAC1C;AACA,gBAAU,CAAC,CAAC;AACZ,gBAAU,OAAO;AAAA,IACnB,SAAS,KAAK;AACZ,UAAI,eAAe,gBAAgB,IAAI,SAAS,YAAa,WAAU,WAAW;AAAA,WAC7E;AACH,iBAAS,eAAe,QAAQ,IAAI,UAAU,EAAE,YAAY,WAAW,CAAC;AACxE,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,aAAa,WAAW,CAAC,CAAC;AAElD,EAAAC,WAAU,MAAM;AACd,SAAK,KAAK;AAAA,EACZ,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,SAAS;AAAA,IACb,CAAC,kBAA0B;AACzB,kBAAY,UAAU;AACtB,kBAAY,aAAa;AACzB,YAAM,QAAQ,WAAW,YAAY,KAAK,CAAC,MAAM,EAAE,cAAc,aAAa;AAC9E,gBAAU,cAAc,SAAS,KAAK,CAAC,CAAC;AACxC,gBAAU,CAAC,CAAC;AAAA,IACd;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,WAAW,YAAY,CAAC,MAAc,UAAkB;AAC5D,cAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,MAAM,EAAE;AAC1C,cAAU,CAAC,MAAM;AACf,UAAI,EAAE,QAAQ,GAAI,QAAO;AACzB,YAAM,EAAE,CAAC,IAAI,GAAG,OAAO,GAAG,KAAK,IAAI;AACnC,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,YAAY,YAAY;AACrC,QAAI,CAAC,cAAc,WAAW,aAAc;AAC5C,UAAM,EAAE,YAAY,QAAQ,SAAS,IAAI,gBAAgB,QAAQ,MAAM;AACvE,QAAI,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AACpC;AAAA,QACE,OAAO;AAAA,UACL,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;AAAA,YACvC;AAAA,YACA,MAAM,aACF,EAAE,YAAY,UAAU,IACxB,MAAM,WACJ,EAAE,YAAY,YAAY,IAC1B,EAAE,YAAY,SAAS;AAAA,UAC/B,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AACA,cAAU,YAAY;AACtB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,OAAO,SAAS,IAAI,aAAa;AAAA,MACnC;AACA,iBAAW,MAAM;AACjB,gBAAU,OAAO,WAAW,WAAW,WAAW,SAAS;AAAA,IAC7D,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,EAAE,YAAY,aAAa,CAAC;AAC1E,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,aAAa,YAAY,QAAQ,QAAQ,QAAQ,CAAC,CAAC;AAE3E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAsBA,IAAM,cAA4E;AAAA,EAChF,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACV;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AACF,GAAuB;AACrB,QAAM,EAAE,GAAG,OAAO,IAAI,WAAW;AACjC,QAAM,UAAU,UAAU,UAAU;AACpC,QAAM,IAAI,YAAY,YAAY,aAAa,SAAS;AACxD,QAAM,eAAe,OAAO,SAAS;AACrC,eAAa,UAAU;AAEvB,EAAAA,WAAU,MAAM;AACd,SAAK,EAAE,WAAW,aAAa,EAAE,WAAW,aAAa,EAAE,SAAS;AAClE,mBAAa,UAAU,EAAE,OAAO;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC;AAExB,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,QAAQ,EAAE;AAChB,QAAM,SAAS,aAAa,CAAC,IAAI,SAAS,KAAK;AAC/C,QAAM,gBAAgB,OAAO,QAAQ,MAAM;AAC3C,QAAM,YAAY,OAAO,iBAAiB,YAAY,EAAE,WAAW;AACnE,QAAM,MAAM,CAAC,QACX,MAAM,IAAI,KAAK,GAAG,EAAE,eAAe,WAAW,OAAO,UAAU,OAAO,IAAI;AAE5E,QAAM,WAAW,CAAC,MAAiB;AACjC,MAAE,eAAe;AACjB,SAAK,EAAE,OAAO;AAAA,EAChB;AAEA,SACE,gBAAAH,MAAC,SAAM,WAAW,GAAG,gBAAgB,SAAS,GAAG,aAAW,EAAE,WAAW,WACvE;AAAA,oBAAAA,MAAC,YAAO,WAAU,sBAChB;AAAA,sBAAAD,KAAC,WAAS,YAAE,YAAY,SAAS,GAAE;AAAA,MACnC,gBAAAA,KAAC,QAAG,WAAU,uBAAuB,mBAAS,EAAE,YAAY,OAAO,GAAE;AAAA,MACpE,eAAe,gBAAAA,KAAC,OAAE,WAAU,sBAAsB,uBAAY;AAAA,MAC9D,EAAE,aACD,gBAAAC,MAAC,OAAE,WAAU,sBACV;AAAA,UAAE,YAAY,WAAW;AAAA,QAAG;AAAA,QAC7B,gBAAAD,KAAC,UAAK,WAAU,4BAA4B,YAAE,UAAU,YAAY,MAAM,GAAG,CAAC,GAAE;AAAA,QAC/E,EAAE,UAAU,YACX,gBAAAC,MAAAF,WAAA,EACG;AAAA;AAAA,UACA,EAAE,YAAY,UAAU;AAAA,UAAE;AAAA,UAAE,IAAI,EAAE,UAAU,QAAQ;AAAA,WACvD;AAAA,SAEJ;AAAA,OAEJ;AAAA,IAEC,EAAE,WAAW,aACZ,gBAAAE,MAAC,SAAI,WAAU,uBACb;AAAA,sBAAAD,KAAC,WAAQ,OAAO,EAAE,UAAU,SAAS,GAAG;AAAA,MAAE;AAAA,MAAE,EAAE,UAAU,SAAS;AAAA,OACnE;AAAA,IAGD,EAAE,WAAW,eACZ,gBAAAA,KAAC,SAAI,WAAU,uBACb,0BAAAA,KAAC,OAAG,YAAE,YAAY,UAAU,GAAE,GAChC;AAAA,IAGD,EAAE,WAAW,WACZ,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,sBAAAD,KAAC,OAAE,WAAU,uBAAuB,YAAE,OAAM;AAAA,MAC5C,gBAAAA,KAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAM,KAAK,EAAE,OAAO,GAC9D,YAAE,UAAU,OAAO,GACtB;AAAA,OACF;AAAA,IAGD,EAAE,aAAa,EAAE,UAAU,YAAY,SAAS,KAC/C,gBAAAA,KAAC,SAAI,WAAU,wBAAuB,cAAY,EAAE,YAAY,QAAQ,GACrE,YAAE,UAAU,YAAY,IAAI,CAAC,GAAG,MAC/B,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAEL,WAAW;AAAA,UACT;AAAA,UACA,EAAE,cAAc,OAAO,aAAa;AAAA,QACtC;AAAA,QACA,SAAS,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAEnC;AAAA,0BAAAA,MAAC,UACE;AAAA,cAAE,YAAY,OAAO;AAAA,YAAE;AAAA,YAAE,IAAI;AAAA,aAChC;AAAA,UACA,gBAAAD,KAAC,OAAI,MAAM,YAAY,EAAE,YAAY,KAAK,WACvC,YAAE,YAAY,EAAE,YAAY,GAC/B;AAAA;AAAA;AAAA,MAZK,EAAE;AAAA,IAaT,CACD,GACH;AAAA,IAGD,SAAS,EAAE,WAAW,aACrB,gBAAAC,MAAAF,WAAA,EACE;AAAA,sBAAAE,MAAC,SAAI,WAAU,wBACb;AAAA,wBAAAD,KAAC,OAAI,MAAM,YAAY,MAAM,YAAY,KAAK,WAC3C,YAAE,YAAY,MAAM,YAAY,GACnC;AAAA,QACC,OAAO,MAAM,kBAAkB,YAAY,MAAM,gBAAgB,KAChE,gBAAAC,MAAC,UAAK,WAAU,uBACb;AAAA,YAAE,YAAY,eAAe;AAAA,UAAE;AAAA,UAAE,MAAM;AAAA,WAC1C;AAAA,SAEJ;AAAA,MAEC,cAAc,SAAS,KACtB,gBAAAA,MAAC,aAAQ,WAAU,wBAAuB,cAAY,EAAE,YAAY,QAAQ,GAC1E;AAAA,wBAAAD,KAAC,SAAI,WAAU,8BAA8B,YAAE,YAAY,QAAQ,GAAE;AAAA,QACrE,gBAAAA,KAAC,QAAG,WAAU,oBACX,wBAAc,IAAI,CAAC,CAAC,GAAG,CAAC,MACvB,gBAAAC,MAAC,SAAY,WAAU,wBACrB;AAAA,0BAAAD,KAAC,QAAI,aAAE;AAAA,UACP,gBAAAA,KAAC,QAAI,iBAAO,MAAM,WAAW,IAAI,KAAK,UAAU,GAAG,MAAM,CAAC,GAAE;AAAA,aAFpD,CAGV,CACD,GACH;AAAA,SACF;AAAA,OAGA,EAAE,WAAW,aAAa,EAAE,WAAW,aAAa,EAAE,UACtD,gBAAAC,MAAC,YAAO,WAAU,sBAChB;AAAA,wBAAAD,KAAC,OAAI,MAAM,EAAE,WAAW,WAAW,WAAW,MAC3C,YAAE,YAAY,EAAE,WAAW,WAAW,WAAW,SAAS,GAC7D;AAAA,QACA,gBAAAA,KAAC,OACE,YAAE,WAAW,WACV,EAAE,YAAY,eAAe,IAC7B,EAAE,YAAY,gBAAgB,GACpC;AAAA,SACF,IAEA,gBAAAC,MAAC,UAAK,WAAU,sBAAqB,UAClC;AAAA,UAAE,OAAO,IAAI,CAAC,MACb,gBAAAD,KAAC,SAAiB,OAAO,EAAE,OAAO,MAAM,EAAE,aAAa,OAAO,EAAE,OAAO,EAAE,IAAI,GAC1E,sBAAY,GAAG,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,KADtE,EAAE,EAEd,CACD;AAAA,QACA,EAAE,SAAS,gBAAAA,KAAC,OAAE,WAAU,uBAAuB,YAAE,OAAM;AAAA,QACxD,gBAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,0BAAAD,KAAC,UAAO,SAAQ,UAAS,MAAK,UAAS,UAAU,CAAC,WAC/C,YAAE,WAAW,eACZ,gBAAAC,MAAAF,WAAA,EACE;AAAA,4BAAAC,KAAC,WAAQ,OAAO,EAAE,YAAY,YAAY,GAAG;AAAA,YAAE;AAAA,YAAE,EAAE,YAAY,YAAY;AAAA,aAC7E,IAEC,eAAe,EAAE,YAAY,QAAQ,GAE1C;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,KAAK,EAAE,OAAO;AAAA,cAC7B,UAAU,EAAE,WAAW;AAAA,cAEtB,YAAE,YAAY,SAAS;AAAA;AAAA,UAC1B;AAAA,WACF;AAAA,SACF;AAAA,OAEJ;AAAA,KAEJ;AAEJ;AAEA,SAAS,YAAY,GAAgB,OAAe,KAA0B,UAAmB;AAC/F,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA,UAEnC;AAAA,4BAAAD,KAAC,YAAO,OAAM,IAAG,oBAAC;AAAA,YAClB,gBAAAA,KAAC,YAAO,OAAM,QAAO,kBAAI;AAAA,YACzB,gBAAAA,KAAC,YAAO,OAAM,SAAQ,mBAAK;AAAA;AAAA;AAAA,MAC7B;AAAA,IAEJ,KAAK;AACH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA,aAAa,EAAE;AAAA,UACf,UAAU,EAAE;AAAA,UACZ;AAAA,UACA,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA;AAAA,MACrC;AAAA,IAEJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAM,EAAE,QAAQ;AAAA,UAChB,aAAa,EAAE,eAAe;AAAA,UAC9B,UAAU,EAAE;AAAA,UACZ;AAAA,UACA,WAAU;AAAA,UACV,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA;AAAA,MACrC;AAAA,IAEJ;AACE,UAAI,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,SAAS,GAAG;AACpD,eACE,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA,YAEnC;AAAA,8BAAAD,KAAC,YAAO,OAAM,IAAG,oBAAC;AAAA,cACjB,EAAE,QAAQ,IAAI,CAAC,MAAM;AACpB,sBAAM,MACJ,OAAO,MAAM,YAAY,MAAM,OAC1B,IACD,EAAE,OAAO,GAAG,OAAO,EAAE;AAC3B,sBAAM,IAAI,OAAO,IAAI,SAAS,EAAE;AAChC,uBACE,gBAAAA,KAAC,YAAe,OAAO,GACpB,iBAAO,IAAI,SAAS,CAAC,KADX,CAEb;AAAA,cAEJ,CAAC;AAAA;AAAA;AAAA,QACH;AAAA,MAEJ;AACA,WAAK,EAAE,QAAQ,KAAK,GAAG;AACrB,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,UAAU,EAAE;AAAA,YACZ;AAAA,YACA,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA;AAAA,QACrC;AAAA,MAEJ;AACA,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,aAAa,EAAE;AAAA,UACf,UAAU,EAAE;AAAA,UACZ;AAAA,UACA,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA;AAAA,MACrC;AAAA,EAEN;AACF;;;AI7bA,SAA2C,eAAAK,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACA3F,SAAS,YAAAC,iBAAgC;AAQhC,gBAAAC,MAkKK,QAAAC,aAlKL;AADF,SAAS,SAAS,EAAE,MAAM,UAAU,GAAyC;AAClF,SAAO,gBAAAD,KAAC,SAAI,WAAuB,uBAAa,YAAY,IAAI,CAAC,GAAE;AACrE;AAkBA,IAAM,QAAQ;AACd,IAAM,UAAU;AAChB,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,kBAAkB;AAEjB,SAAS,YAAY,MAAuB;AACjD,QAAM,QAAQ,KAAK,QAAQ,UAAU,IAAI,EAAE,MAAM,IAAI;AACrD,QAAM,SAAkB,CAAC;AACzB,MAAI,IAAI;AACR,MAAI,YAAsB,CAAC;AAE3B,QAAM,QAAQ,MAAM;AAClB,QAAI,UAAU,SAAS,GAAG;AACxB,aAAO,KAAK,EAAE,MAAM,aAAa,OAAO,UAAU,CAAC;AACnD,kBAAY,CAAC;AAAA,IACf;AAAA,EACF;AAEA,SAAO,IAAI,MAAM,QAAQ;AACvB,UAAM,OAAO,MAAM,CAAC;AAEpB,QAAI,KAAK,KAAK,MAAM,IAAI;AACtB,YAAM;AACN,WAAK;AACL;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,KAAK,IAAI;AAC7B,QAAI,OAAO;AACT,YAAM;AACN,YAAM,SAAS,MAAM,CAAC;AACtB,YAAM,OAAO,MAAM,CAAC,KAAK;AACzB,YAAM,OAAiB,CAAC;AACxB,WAAK;AACL,aAAO,IAAI,MAAM,UAAU,CAAE,MAAM,CAAC,EAAa,KAAK,EAAE,WAAW,MAAM,GAAG;AAC1E,aAAK,KAAK,MAAM,CAAC,CAAW;AAC5B,aAAK;AAAA,MACP;AACA,WAAK;AACL,aAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,KAAK,IAAI,EAAE,CAAC;AACzD;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,KAAK,IAAI;AACjC,QAAI,SAAS;AACX,YAAM;AACN,aAAO,KAAK,EAAE,MAAM,WAAW,OAAQ,QAAQ,CAAC,EAAa,QAAQ,MAAM,QAAQ,CAAC,KAAK,GAAG,CAAC;AAC7F,WAAK;AACL;AAAA,IACF;AAEA,QAAI,KAAK,KAAK,IAAI,GAAG;AACnB,YAAM;AACN,aAAO,KAAK,EAAE,MAAM,OAAO,CAAC;AAC5B,WAAK;AACL;AAAA,IACF;AAEA,QAAI,MAAM,KAAK,IAAI,GAAG;AACpB,YAAM;AACN,YAAM,QAAkB,CAAC;AACzB,aAAO,IAAI,MAAM,UAAU,MAAM,KAAK,MAAM,CAAC,CAAW,GAAG;AACzD,cAAM,KAAM,MAAM,KAAK,MAAM,CAAC,CAAW,EAAsB,CAAC,KAAK,EAAE;AACvE,aAAK;AAAA,MACP;AACA,aAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,YAAY,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AACpE;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,KAAK,IAAI;AAC3B,QAAI,MAAM;AACR,YAAM;AACN,YAAM,UAAU,KAAK,CAAC,MAAM;AAC5B,YAAM,QAAQ,UAAU,OAAO,SAAS,KAAK,CAAC,GAAa,EAAE,IAAI;AACjE,YAAM,QAAkB,CAAC;AACzB,aAAO,IAAI,MAAM,QAAQ;AACvB,cAAM,IAAI,KAAK,KAAK,MAAM,CAAC,CAAW;AACtC,YAAI,KAAM,EAAE,CAAC,MAAM,WAAe,SAAS;AACzC,gBAAM,KAAK,EAAE,CAAC,KAAK,EAAE;AACrB,eAAK;AAAA,QACP,WACE,MAAM,SAAS,KACd,MAAM,CAAC,EAAa,KAAK,MAAM,MAChC,UAAU,KAAK,MAAM,CAAC,CAAW,KACjC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAW,GAC7B;AAEA,gBAAM,MAAM,SAAS,CAAC,IAAI,GAAG,MAAM,MAAM,SAAS,CAAC,CAAC,IAAK,MAAM,CAAC,EAAa,KAAK,CAAC;AACnF,eAAK;AAAA,QACP,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,OAAO,MAAM,CAAC;AACnD;AAAA,IACF;AAEA,QACE,KAAK,SAAS,GAAG,KACjB,IAAI,IAAI,MAAM,UACd,gBAAgB,KAAK,MAAM,IAAI,CAAC,CAAW,GAC3C;AACA,YAAM;AACN,YAAM,SAAS,SAAS,IAAI;AAC5B,YAAM,QAAQ,SAAS,MAAM,IAAI,CAAC,CAAW,EAAE,IAAI,CAAC,SAAS;AAC3D,cAAM,OAAO,KAAK,WAAW,GAAG;AAChC,cAAM,QAAQ,KAAK,SAAS,GAAG;AAC/B,YAAI,QAAQ,MAAO,QAAO;AAC1B,YAAI,MAAO,QAAO;AAClB,YAAI,KAAM,QAAO;AACjB,eAAO;AAAA,MACT,CAAC;AACD,YAAM,OAAmB,CAAC;AAC1B,WAAK;AACL,aAAO,IAAI,MAAM,UAAW,MAAM,CAAC,EAAa,SAAS,GAAG,GAAG;AAC7D,aAAK,KAAK,SAAS,MAAM,CAAC,CAAW,CAAC;AACtC,aAAK;AAAA,MACP;AACA,aAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,OAAO,KAAK,CAAC;AAClD;AAAA,IACF;AAEA,cAAU,KAAK,IAAI;AACnB,SAAK;AAAA,EACP;AACA,QAAM;AACN,SAAO;AACT;AAEA,SAAS,SAAS,MAAwB;AACxC,QAAM,UAAU,KAAK,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAChE,SAAO,QAAQ,MAAM,WAAW,EAAE,IAAI,CAAC,SAAS,KAAK,QAAQ,SAAS,GAAG,EAAE,KAAK,CAAC;AACnF;AAEA,SAAS,aAAa,QAA8B;AAClD,SAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AAClC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eACE,gBAAAA,KAAC,OACE,gBAAM,MAAM,IAAI,CAAC,MAAM,MACtB,gBAAAC,MAACF,WAAA,EACE;AAAA,cAAI,KAAK,gBAAAC,KAAC,QAAG;AAAA,UACb,aAAa,IAAI;AAAA,aAFL,CAGf,CACD,KANK,KAOR;AAAA,MAEJ,KAAK,WAAW;AACd,cAAME,OAAM,IAAI,KAAK,IAAI,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC5C,eAAO,gBAAAF,KAACE,MAAA,EAAiB,uBAAa,MAAM,IAAI,KAA/B,KAAiC;AAAA,MACpD;AAAA,MACA,KAAK;AACH,eACE,gBAAAF,KAAC,SAAgB,aAAW,MAAM,QAAQ,QACxC,0BAAAA,KAAC,UAAM,gBAAM,MAAK,KADV,KAEV;AAAA,MAEJ,KAAK;AACH,eAAO,gBAAAA,KAAC,gBAAwB,uBAAa,MAAM,MAAM,KAAjC,KAAmC;AAAA,MAC7D,KAAK,QAAQ;AACX,cAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,MAAM,MAAM,gBAAAA,KAAC,QAAY,uBAAa,IAAI,KAArB,CAAuB,CAAK;AAChF,eAAO,MAAM,UACX,gBAAAA,KAAC,QAAe,OAAO,MAAM,UAAU,IAAI,SAAY,MAAM,OAC1D,mBADM,KAET,IAEA,gBAAAA,KAAC,QAAgB,mBAAR,KAAc;AAAA,MAE3B;AAAA,MACA,KAAK;AACH,eACE,gBAAAA,KAAC,SAAgB,WAAU,iBACzB,0BAAAC,MAAC,WACC;AAAA,0BAAAD,KAAC,WACC,0BAAAA,KAAC,QACE,gBAAM,OAAO,IAAI,CAAC,MAAM,MACvB,gBAAAA,KAAC,QAAW,OAAO,WAAW,MAAM,MAAM,CAAC,CAAC,GACzC,uBAAa,IAAI,KADX,CAET,CACD,GACH,GACF;AAAA,UACA,gBAAAA,KAAC,WACE,gBAAM,KAAK,IAAI,CAAC,KAAK,MACpB,gBAAAA,KAAC,QACE,gBAAM,OAAO,IAAI,CAAC,GAAG,MACpB,gBAAAA,KAAC,QAAW,OAAO,WAAW,MAAM,MAAM,CAAC,CAAC,GACzC,uBAAa,IAAI,CAAC,KAAK,EAAE,KADnB,CAET,CACD,KALM,CAMT,CACD,GACH;AAAA,WACF,KAtBQ,KAuBV;AAAA,MAEJ,KAAK;AACH,eAAO,gBAAAA,KAAC,UAAQ,KAAO;AAAA,IAC3B;AAAA,EACF,CAAC;AACH;AAEA,SAAS,WAAW,OAAuD;AACzE,SAAO,QAAQ,EAAE,WAAW,MAAM,IAAI;AACxC;AAIA,IAAM,SACJ;AAEK,SAAS,aAAa,MAA2B;AACtD,QAAM,QAAqB,CAAC;AAC5B,MAAI,OAAO;AACX,MAAI,MAAM;AAGV,QAAM,SAAS,IAAI,OAAO,OAAO,QAAQ,GAAG;AAC5C,MAAI,QAAQ,OAAO,KAAK,IAAI;AAC5B,SAAO,OAAO;AACZ,QAAI,MAAM,QAAQ,KAAM,OAAM,KAAK,KAAK,MAAM,MAAM,MAAM,KAAK,CAAC;AAChE,UAAM,CAAC,EAAE,EAAE,MAAM,MAAM,SAAS,QAAQ,QAAQ,WAAW,UAAU,UAAU,QAAQ,IAAI;AAC3F,QAAI,SAAS,QAAW;AACtB,YAAM,KAAK,gBAAAA,KAAC,UAAkB,eAAK,KAAK,KAAlB,KAAoB,CAAO;AAAA,IACnD,WAAW,SAAS,UAAa,YAAY,QAAW;AACtD,YAAM,KAAK,gBAAAA,KAAC,YAAoB,uBAAc,QAAQ,OAAkB,KAAhD,KAAkD,CAAS;AAAA,IACrF,WAAW,WAAW,QAAW;AAC/B,YAAM,KAAK,gBAAAA,KAAC,SAAiB,uBAAa,MAAM,KAA3B,KAA6B,CAAM;AAAA,IAC1D,WAAW,WAAW,UAAa,cAAc,QAAW;AAC1D,YAAM,KAAK,gBAAAA,KAAC,QAAgB,uBAAc,UAAU,SAAoB,KAApD,KAAsD,CAAK;AAAA,IACjF,WAAW,aAAa,UAAa,aAAa,QAAW;AAC3D,YAAM,KAAK,KAAK,OAAO,UAAU,aAAa,QAAQ,CAAC,CAAC;AAAA,IAC1D,WAAW,aAAa,QAAW;AACjC,YAAM,KAAK,KAAK,OAAO,UAAU,QAAQ,CAAC;AAAA,IAC5C;AACA,WAAO,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC9B,YAAQ,OAAO,KAAK,IAAI;AAAA,EAC1B;AACA,MAAI,OAAO,KAAK,OAAQ,OAAM,KAAK,KAAK,MAAM,IAAI,CAAC;AACnD,SAAO;AACT;AAEA,IAAM,YAAY;AAElB,SAAS,KAAK,KAAa,MAAc,UAAgC;AACvE,MAAI,CAAC,UAAU,KAAK,IAAI,EAAG,QAAO,gBAAAA,KAACD,WAAA,EAAoB,YAAN,GAAe;AAChE,SACE,gBAAAC,KAAC,OAAY,MAAY,QAAO,UAAS,KAAI,uBAC1C,YADK,GAER;AAEJ;;;AC3JgC,gBAAAG,MAEpB,QAAAC,aAFoB;AAtFhC,IAAM,WAAW,CAAC,MAChB,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AACzD,IAAM,gBAAgB,CAAC,MACrB,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ;AAC1D,IAAM,gBAAgB,CAAC,MACrB,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ;AAE1D,SAAS,OAAO,GAAiC;AAC/C,SACE,SAAS,CAAC,KACV,OAAO,EAAE,UAAU,YACnB,OAAO,EAAE,aAAa,YACtB,OAAO,EAAE,SAAS,YAClB,OAAO,EAAE,UAAU;AAEvB;AAEA,SAAS,cAAc,KAAqC;AAC1D,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,QAAM,OAAO,IAAI;AACjB,QAAM,UAAU,IAAI;AACpB,QAAM,QAAQ,IAAI;AAClB,QAAM,MAAM,IAAI;AAChB,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;AAC9E,MAAI,CAAC,SAAS,IAAI,KAAK,OAAO,KAAK,YAAY,SAAU,QAAO;AAChE,MACE,CAAC,MAAM,QAAQ,OAAO,KACtB,CAAC,QAAQ;AAAA,IACP,CAAC,MAAM,SAAS,CAAC,KAAK,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,WAAW;AAAA,EAC3E;AAEA,WAAO;AACT,MACE,CAAC,SAAS,KAAK,KACf,CAAC,cAAc,MAAM,OAAO,KAC5B,CAAC,MAAM,QAAQ,MAAM,IAAI,KACzB,CAAC,MAAM,KAAK,MAAM,aAAa;AAE/B,WAAO;AACT,MAAI,CAAC,MAAM,MAAM,MAAM,EAAG,QAAO;AACjC,MAAI,CAAC,SAAS,GAAG,KAAK,CAAC,cAAc,IAAI,MAAM,KAAK,CAAC,cAAc,IAAI,IAAI,EAAG,QAAO;AACrF,MAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,QAAQ,YAAY,OAAO,MAAM,YAAY;AAChF,WAAO;AACT,SAAO;AAAA,IACL,MAAM,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGO,SAAS,gBAAgB,KAAwC;AACtE,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,QAAQ,MAAM,IAC7B,SACA,SAAS,MAAM,KAAK,MAAM,QAAQ,OAAO,KAAK,IAC5C,OAAO,QACP;AACN,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,KAAK,IAAI,aAAa;AACpC,MAAI,MAAM,KAAK,CAAC,MAAM,MAAM,IAAI,EAAG,QAAO;AAC1C,SAAO,EAAE,MAAiC;AAC5C;AAUO,SAAS,aAAa,EAAE,UAAU,SAAS,GAAsB;AACtE,SACE,gBAAAD,KAAC,SAAI,WAAU,WACZ,mBAAS,MAAM,IAAI,CAAC,MAAM,MACzB,gBAAAC,MAAC,SAAY,WAAU,iBACpB;AAAA,SAAK,KAAK,WAAW,gBAAAD,KAAC,OAAE,WAAU,iBAAiB,eAAK,KAAK,SAAQ;AAAA,IACrE,KAAK,MAAM,OACV,gBAAAC,MAAC,YAAO,WAAU,mBAChB;AAAA,sBAAAD,KAAC,SAAI,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,SAAS;AAAA,MAClD,KAAK,MAAM,WAAW,gBAAAA,KAAC,gBAAY,eAAK,MAAM,SAAQ;AAAA,OACzD;AAAA,IAED,KAAK,MAAM,SAAS,KACnB,gBAAAA,KAAC,SAAI,WAAU,kBACZ,eAAK,MAAM,IAAI,CAAC,GAAG,OAClB,gBAAAC,MAAC,SAAa,WAAU,2BACrB;AAAA,QAAE,SAAS,gBAAAD,KAAC,SAAI,KAAK,EAAE,OAAO,KAAI,IAAG;AAAA,MACtC,gBAAAC,MAAC,SACC;AAAA,wBAAAD,KAAC,SAAI,WAAU,uBAAuB,YAAE,OAAM;AAAA,QAC7C,EAAE,YAAY,gBAAAA,KAAC,SAAI,WAAU,qBAAqB,YAAE,UAAS;AAAA,QAC7D,EAAE,QAAQ,gBAAAA,KAAC,OAAG,YAAE,MAAK;AAAA,SACxB;AAAA,SANQ,EAOV,CACD,GACH;AAAA,IAED,KAAK,MAAM,QAAQ,SAAS,KAC3B,gBAAAA,KAAC,SAAI,WAAU,mBACb,0BAAAC,MAAC,WAAM,WAAU,aACf;AAAA,sBAAAD,KAAC,WACC,0BAAAA,KAAC,QACE,eAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,OAC1B,gBAAAA,KAAC,QAAa,eAAL,EAAO,CACjB,GACH,GACF;AAAA,MACA,gBAAAA,KAAC,WACE,eAAK,MAAM,KAAK,IAAI,CAAC,GAAG,OACvB,gBAAAA,KAAC,QACE,YAAE,IAAI,CAAC,MAAM,OACZ,gBAAAA,KAAC,QAAa,kBAAL,EAAU,CACpB,KAHM,EAIT,CACD,GACH;AAAA,OACF,GACF;AAAA,IAED,KAAK,IAAI,OAAO,SAAS,KAAK,gBAAAA,KAAC,OAAI,QAAQ,KAAK,IAAI,QAAQ,MAAM,KAAK,IAAI,MAAM;AAAA,IACjF,KAAK,QAAQ,SAAS,KACrB,gBAAAA,KAAC,SAAI,WAAU,oBACZ,eAAK,QAAQ,IAAI,CAAC,GAAG,OACpB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,WAAW,EAAE,MAAM;AAAA,QAEjC,YAAE;AAAA;AAAA,MALE;AAAA,IAMP,CACD,GACH;AAAA,OAzDM,CA2DV,CACD,GACH;AAEJ;AAEA,SAAS,IAAI,EAAE,QAAQ,KAAK,GAAkB;AAC5C,QAAM,QAAQ,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;AACzD,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,QAAQ;AACZ,QAAM,SAAS,OAAO,IAAI,CAAC,OAAO,MAAM;AACtC,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;AACtC,UAAM,QAAQ;AACd,aAAU,QAAQ,QAAS;AAC3B,WAAO,EAAE,OAAO,OAAO,OAAO,KAAK,OAAO,OAAO,cAAe,IAAI,IAAK,CAAC,IAAI;AAAA,EAChF,CAAC;AACD,QAAM,MAAM,CAAC,OAAe,QAAgB;AAC1C,UAAM,IAAI;AACV,UAAME,MAAK;AACX,UAAM,KAAK;AACX,UAAM,MAAO,QAAQ,MAAM,KAAK,KAAM;AACtC,UAAM,MAAO,MAAM,MAAM,KAAK,KAAM;AACpC,UAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI;AACtC,UAAM,KAAKA,MAAK,IAAI,KAAK,IAAI,EAAE;AAC/B,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAC/B,UAAM,KAAKA,MAAK,IAAI,KAAK,IAAI,EAAE;AAC/B,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAC/B,QAAI,MAAM,SAAS,IAAK,QAAO,IAAIA,GAAE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAUA,MAAK,IAAI,IAAI,KAAK,CAAC;AACvF,WAAO,IAAIA,GAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE;AAAA,EACtE;AACA,SACE,gBAAAD,MAAC,SAAI,WAAU,gBACb;AAAA,oBAAAA,MAAC,SAAI,SAAQ,eAAc,MAAK,OAAM,cAAY,OAAO,KAAK,IAAI,GAChE;AAAA,sBAAAD,KAAC,WAAO,iBAAO,KAAK,IAAI,GAAE;AAAA,MACzB,OAAO,IAAI,CAAC,MACX,gBAAAA,KAAC,UAAmB,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,EAAE,SAAzC,EAAE,KAA8C,CAC5D;AAAA,OACH;AAAA,IACA,gBAAAA,KAAC,QACE,iBAAO,IAAI,CAAC,MACX,gBAAAC,MAAC,QACC;AAAA,sBAAAD,KAAC,UAAK,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG;AAAA,MACrC,EAAE;AAAA,MACH,gBAAAC,MAAC,OAAG;AAAA,aAAK,MAAO,EAAE,QAAQ,QAAS,GAAG;AAAA,QAAE;AAAA,SAAC;AAAA,SAHlC,EAAE,KAIX,CACD,GACH;AAAA,KACF;AAEJ;;;ACzOA,SAAS,eAAAE,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAiDzD,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB;AACvB,IAAM,aAAa;AAEZ,SAAS,mBAA4B;AAC1C,SACE,OAAO,WAAW,eAClB,OAAO,cAAc,eACrB,CAAC,CAAC,UAAU,cAAc,gBAC1B,OAAO,kBAAkB;AAE7B;AAEO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV,GAAmC;AACjC,QAAM,EAAE,QAAQ,EAAE,IAAI,WAAW;AACjC,QAAM,YAAY,iBAAiB;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAqB,YAAY,SAAS,aAAa;AACjF,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,CAAC;AAEpC,QAAM,cAAcC,QAA6B,IAAI;AACrD,QAAM,YAAYA,QAA2B,IAAI;AACjD,QAAM,YAAYA,QAAe,CAAC,CAAC;AACnC,QAAM,aAAaA,QAAO,KAAK;AAC/B,QAAM,YAAYA,QAAiB,CAAC,CAAC;AACrC,QAAM,WAAWA,QAAuD,IAAI;AAC5E,QAAM,WAAWA,QAAgC,IAAI;AACrD,QAAM,cAAcA,QAAsB,IAAI;AAC9C,QAAM,cAAcA,QAAO,KAAK;AAChC,QAAM,kBAAkBA,QAAO,YAAY;AAC3C,kBAAgB,UAAU;AAE1B,QAAM,cAAcC,aAAY,MAAM;AACpC,eAAW,MAAM,UAAU,QAAS,QAAO,aAAa,EAAE;AAC1D,cAAU,UAAU,CAAC;AACrB,QAAI,SAAS,SAAS;AACpB,aAAO,cAAc,SAAS,QAAQ,QAAQ;AAC9C,WAAK,SAAS,QAAQ,IAAI,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAChD,eAAS,UAAU;AAAA,IACrB;AACA,aAAS,CAAC;AAAA,EACZ,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA,aAAY,MAAM;AACtC,eAAW,SAAS,UAAU,SAAS,UAAU,KAAK,CAAC,EAAG,OAAM,KAAK;AACrE,cAAU,UAAU;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,aAAY,MAAM;AACrC,UAAM,QAAQ,SAAS;AACvB,QAAI,OAAO;AACT,YAAM,MAAM;AACZ,YAAM,MAAM;AACZ,eAAS,UAAU;AAAA,IACrB;AACA,QAAI,YAAY,SAAS;AACvB,UAAI,gBAAgB,YAAY,OAAO;AACvC,kBAAY,UAAU;AAAA,IACxB;AACA,aAAS,CAAC,MAAO,MAAM,aAAa,SAAS,CAAE;AAAA,EACjD,GAAG,CAAC,CAAC;AAEL,QAAM,SAASA,aAAY,CAAC,aAA4B;AACtD,aAAS,KAAK;AAAA,EAChB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA,aAAY,MAAM;AACtC,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,YAAY,SAAS,UAAU,WAAY;AAChD,eAAW,UAAU;AACrB,WAAO,QAAQ;AAAA,EACjB,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,kBAAkBA,aAAY,MAAM;AACxC,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,YAAY,SAAS,UAAU,WAAY;AAChD,eAAW,UAAU;AACrB,WAAO,QAAQ;AAAA,EACjB,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,aAAaA;AAAA,IACjB,CAAC,QAAqB,cAA0B;AAC9C,YAAM,MACJ,OAAO,iBAAiB,cACpB,eACC,OAAmE;AAC1E,UAAI,CAAC,IAAK;AACV,UAAI;AACF,cAAM,MAAM,IAAI,IAAI;AACpB,cAAM,WAAW,IAAI,eAAe;AACpC,iBAAS,UAAU;AACnB,YAAI,wBAAwB,MAAM,EAAE,QAAQ,QAAQ;AACpD,cAAM,OAAO,IAAI,WAAW,SAAS,OAAO;AAC5C,YAAI,QAAQ;AACZ,YAAI,YAAY,KAAK,IAAI;AACzB,cAAM,WAAW,OAAO,YAAY,MAAM;AACxC,mBAAS,sBAAsB,IAAI;AACnC,cAAI,MAAM;AACV,qBAAW,KAAK,MAAM;AACpB,kBAAM,KAAK,IAAI,OAAO;AACtB,mBAAO,IAAI;AAAA,UACb;AACA,gBAAM,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM;AACvC,mBAAS,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;AAC7B,cAAI,MAAM,YAAY;AACpB,oBAAQ;AACR,wBAAY,KAAK,IAAI;AAAA,UACvB,WAAW,SAAS,KAAK,IAAI,IAAI,YAAY,WAAW;AACtD,sBAAU;AAAA,UACZ;AAAA,QACF,GAAG,GAAG;AACN,iBAAS,UAAU,EAAE,KAAK,SAAS;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,iBAAiBA,aAAY,YAAY;AAC7C,QAAI,CAAC,WAAW;AACd,eAAS,aAAa;AACtB;AAAA,IACF;AACA,QAAI,YAAY,QAAS;AACzB,QAAI,YAAY,WAAW,YAAY,QAAQ,UAAU,WAAY;AACrE,gBAAY,UAAU;AACtB,iBAAa;AACb,aAAS,IAAI;AAEb,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,KAAK,CAAC;AAAA,IACpE,QAAQ;AACN,kBAAY,UAAU;AACtB,eAAS,QAAQ;AACjB,eAAS,EAAE,SAAS,WAAW,CAAC;AAChC;AAAA,IACF;AACA,gBAAY,UAAU;AACtB,cAAU,UAAU;AAEpB,UAAM,WAAW,gBAAgB,KAAK,CAAC,MAAM,cAAc,kBAAkB,CAAC,CAAC;AAC/E,UAAM,WAAW,IAAI,cAAc,QAAQ,WAAW,EAAE,SAAS,IAAI,MAAS;AAC9E,gBAAY,UAAU;AACtB,cAAU,UAAU,CAAC;AACrB,eAAW,UAAU;AAErB,aAAS,kBAAkB,CAAC,MAAM;AAChC,UAAI,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAG,WAAU,QAAQ,KAAK,EAAE,IAAI;AAAA,IAC9D;AACA,aAAS,SAAS,MAAM;AACtB,kBAAY;AACZ,oBAAc;AACd,kBAAY,UAAU;AACtB,YAAM,OAAO,SAAS,YAAY,YAAY;AAC9C,YAAM,OAAO,IAAI,KAAK,UAAU,SAAS,EAAE,KAAK,CAAC;AACjD,gBAAU,UAAU,CAAC;AACrB,UAAI,WAAW,WAAW,KAAK,OAAO,gBAAgB;AACpD,iBAAS,MAAM;AACf;AAAA,MACF;AACA,eAAS,cAAc;AACvB,YAAM,MAAM,KAAK,SAAS,KAAK,IAAI,QAAQ,KAAK,SAAS,KAAK,IAAI,QAAQ;AAC1E,aACG,WAAW,YAAY,MAAM,QAAQ,GAAG,IAAI,QAAQ,EACpD,KAAK,CAAC,WAAW;AAChB,iBAAS,MAAM;AACf,YAAI,OAAO,WAAY,iBAAgB,QAAQ,OAAO,UAAU;AAAA,MAClE,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,iBAAS,MAAM;AACf;AAAA,UACE,eAAe,gBAAgB,IAAI,SAAS,sBACxC,EAAE,SAAS,aAAa,IACxB,EAAE,SAAS,OAAO;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACL;AAEA,aAAS,MAAM,GAAG;AAClB,aAAS,WAAW;AACpB,eAAW,QAAQ,MAAM,cAAc,CAAC;AACxC,cAAU,QAAQ,KAAK,OAAO,WAAW,MAAM,cAAc,GAAG,KAAK,CAAC;AAAA,EACxE,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,QAAQA;AAAA,IACZ,OAAO,SAAiB;AACtB,mBAAa;AACb,eAAS,IAAI;AACb,eAAS,UAAU;AACnB,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,MAAM,YAAY,IAAI;AAChD,cAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,oBAAY,UAAU;AACtB,cAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,iBAAS,UAAU;AACnB,cAAM,IAAI,QAAc,CAAC,YAAY;AACnC,gBAAM,UAAU,MAAM,QAAQ;AAC9B,gBAAM,UAAU,MAAM,QAAQ;AAC9B,gBAAM,UAAU,MAAM,QAAQ;AAC9B,gBAAM,KAAK,EAAE,MAAM,MAAM,QAAQ,CAAC;AAAA,QACpC,CAAC;AAAA,MACH,SAAS,KAAK;AACZ;AAAA,UACE,eAAe,gBAAgB,IAAI,SAAS,sBACxC,EAAE,SAAS,aAAa,IACxB,EAAE,SAAS,OAAO;AAAA,QACxB;AAAA,MACF,UAAE;AACA,YAAI,YAAY,QAAS,KAAI,gBAAgB,YAAY,OAAO;AAChE,oBAAY,UAAU;AACtB,iBAAS,UAAU;AACnB,iBAAS,CAAC,MAAO,MAAM,aAAa,SAAS,CAAE;AAAA,MACjD;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,YAAY,cAAc,CAAC;AAAA,EACtC;AAEA,EAAAC;AAAA,IACE,MAAM,MAAM;AACV,iBAAW,UAAU;AACrB,UAAI,YAAY,WAAW,YAAY,QAAQ,UAAU;AACvD,oBAAY,QAAQ,KAAK;AAC3B,kBAAY;AACZ,oBAAc;AACd,YAAM,QAAQ,SAAS;AACvB,UAAI,MAAO,OAAM,MAAM;AACvB,UAAI,YAAY,QAAS,KAAI,gBAAgB,YAAY,OAAO;AAAA,IAClE;AAAA,IACA,CAAC,aAAa,aAAa;AAAA,EAC7B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AHHY,SAgDJ,YAAAC,WAhDI,OAAAC,MAEF,QAAAC,aAFE;AA7RL,IAAM,oBAAoB,EAAE,UAAU,GAAG,UAAU,KAAK,OAAO,KAAK;AAQpE,SAAS,QAAQ,YAAoB,UAAU,MAAM;AAC1D,QAAM,EAAE,QAAQ,EAAE,IAAI,WAAW;AACjC,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAA4B,IAAI;AAC5D,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAmB,IAAI;AACvD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAA6B;AAC/D,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAC9D,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAwB,CAAC,CAAC;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,CAAC,cAAc,IAAIA,UAAS,MAAM,SAAS,CAAC;AAClD,QAAM,WAAWC,QAA+B,IAAI;AAEpD,QAAM,OAAOC,aAAY,YAAY;AACnC,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,MAAM,MAAM,OAAO,QAAQ,UAAU;AAC3C,UAAI,kBAAkB,KAAK;AACzB,oBAAY,IAAI,iBAAiB,WAAW,OAAO,IAAI,YAAY;AACnE,qBAAa,IAAI,KAAK;AACtB;AAAA,MACF;AACA,gBAAU,GAAG;AACb,kBAAY,IAAI;AAAA,IAClB,SAAS,KAAK;AACZ;AAAA,QACE,eAAe,gBAAgB,IAAI,WAAW,MAC1C,EAAE,QAAQ,aAAa,IACvB,EAAE,QAAQ,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,CAAC,CAAC;AAE1B,EAAAC,WAAU,MAAM;AACd,QAAI,QAAS,MAAK,KAAK;AAAA,EACzB,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,QAAM,WAAW,aAAa,mBAAmB,UAAU,CAAC;AAG5D,QAAM,eAAeD;AAAA,IACnB,OAAO,EAAE,SAAS,MAA4B;AAC5C,YAAM,MAAM,MAAM,OAAO,SAAS,UAAU;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,eAAe,CAAC;AAAA,MACnD,CAAC;AACD,UAAI,IAAI,IAAI;AACV,cAAM,KAAK;AACX,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ,UAAU,gBAAgB,IAAI;AAAA,EACzC;AAGA,QAAM,cAAcA;AAAA,IAClB,OAAO,UAA8C;AACnD,YAAM,MAAM,MAAM,OAAO,SAAS,GAAG,QAAQ,QAAQ;AAAA,QACnD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,MAChC,CAAC;AACD,UAAI,IAAI,GAAI,QAAO;AACnB,aAAO,IAAI,WAAW,MAAM,iBAAiB;AAAA,IAC/C;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,EACnB;AAGA,QAAM,aAAaA;AAAA,IACjB,OAAO,OAAe,QAAgB;AACpC,YAAM,MAAM,MAAM,OAAO,SAAS,GAAG,QAAQ,QAAQ;AAAA,QACnD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,CAAC;AAAA,MACrC,CAAC;AACD,UAAI,IAAI,IAAI;AACV,cAAM,KAAK;AACX,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ,UAAU,IAAI;AAAA,EACzB;AAEA,QAAM,OAAOA,aAAY,MAAM;AAC7B,aAAS,SAAS,MAAM;AACxB,aAAS,UAAU;AACnB,YAAQ,KAAK;AACb,gBAAY,CAAC,SAAS;AACpB,YAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAI,CAAC,QAAQ,KAAK,SAAS,eAAe,CAAC,KAAK,UAAW,QAAO;AAClE,aAAO;AAAA,QACL,GAAG,KAAK,MAAM,GAAG,EAAE;AAAA,QACnB,EAAE,GAAG,MAAM,WAAW,OAAO,SAAS,KAAK,WAAW,EAAE,QAAQ,SAAS,EAAE;AAAA,MAC7E;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC,CAAC;AAEN,QAAM,OAAOA;AAAA,IACX,OAAO,MAAc,QAA2B,CAAC,MAAM;AACrD,YAAM,QAAQ,KAAK,KAAK;AACxB,UAAK,CAAC,SAAS,MAAM,WAAW,KAAM,KAAM;AAC5C,YAAM,cAA2B;AAAA,QAC/B,IAAI,SAAS;AAAA,QACb,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,MAAM,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK,OAAO,EAAE,MAAM,MAAM,KAAK,EAAE;AAAA,MACzE;AACA,YAAM,cAAc,SAAS;AAC7B,kBAAY,CAAC,SAAS;AAAA,QACpB,GAAG;AAAA,QACH;AAAA,QACA,EAAE,IAAI,aAAa,MAAM,aAAa,SAAS,IAAI,WAAW,KAAK;AAAA,MACrE,CAAC;AACD,cAAQ,IAAI;AACZ,YAAM,aAAa,IAAI,gBAAgB;AACvC,eAAS,UAAU;AACnB,UAAI,UAAU;AACd,YAAM,SAAS,CAAC,UACd,YAAY,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,cAAc,EAAE,GAAG,GAAG,GAAG,MAAM,IAAI,CAAE,CAAC;AACxF,UAAI;AACF,yBAAiB,MAAM,OAAO;AAAA,UAC5B;AAAA,UACA,EAAE,OAAO,gBAAgB,MAAM;AAAA,UAC/B,WAAW;AAAA,QACb,GAAG;AACD,cAAI,GAAG,SAAS,SAAS;AACvB,uBAAW,GAAG;AACd,mBAAO,EAAE,QAAQ,CAAC;AAAA,UACpB,WAAW,GAAG,SAAS,SAAS;AAC9B,kBAAME,QAAO,iBAAiB,GAAG,IAAI;AACrC,gBAAIA,SAAQ,CAAC,SAAS;AACpB,wBAAUA;AACV,qBAAO,EAAE,QAAQ,CAAC;AAAA,YACpB;AAAA,UACF,WAAW,GAAG,SAAS,SAAS;AAC9B,mBAAO,EAAE,SAAS,GAAG,SAAS,OAAO,MAAM,WAAW,MAAM,CAAC;AAAA,UAC/D;AAAA,QACF;AACA,eAAO,EAAE,WAAW,OAAO,YAAY,gBAAgB,OAAO,EAAE,CAAC;AAAA,MACnE,SAAS,KAAK;AACZ,YAAI,WAAW,OAAO,QAAS;AAC/B,cAAM,UACJ,eAAe,gBAAgB,IAAI,SAAS,kBACxC,EAAE,QAAQ,aAAa,IACvB,EAAE,QAAQ,OAAO;AACvB,eAAO,EAAE,SAAS,SAAS,OAAO,MAAM,WAAW,MAAM,CAAC;AAC1D,YAAI,eAAe,gBAAgB,IAAI,SAAS,gBAAiB,MAAK,KAAK;AAAA,MAC7E,UAAE;AACA,iBAAS,UAAU;AACnB,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,IACA,CAAC,MAAM,QAAQ,YAAY,gBAAgB,GAAG,IAAI;AAAA,EACpD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,iBAAiB,MAA8B;AACtD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,IAAI;AACV,MAAI,CAAC,EAAE,OAAQ,QAAO;AACtB,aAAW,SAAS,OAAO,OAAO,EAAE,MAAM,GAAG;AAC3C,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,YAAY,SAAU,QAAO,EAAE;AAC5C,UAAI,OAAO,EAAE,WAAW,SAAU,QAAO,EAAE;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAmB;AAC1B,MAAI,OAAO,WAAW,eAAe,gBAAgB,OAAQ,QAAO,OAAO,WAAW;AACtF,SAAO,GAAG,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9E;AAuCO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AACF,GAAoB;AAClB,QAAM,CAAC,MAAM,OAAO,IAAIJ,UAAS,eAAe,SAAS,QAAQ;AACjE,QAAM,EAAE,EAAE,IAAI,WAAW;AACzB,QAAM,UAAU,UAAU,MAAM;AAChC,QAAM,OAAO,QAAQ,YAAY,OAAO;AACxC,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAA2B,IAAI;AACjE,QAAM,eAAeC,QAAO,SAAS;AACrC,eAAa,UAAU;AACvB,QAAM,UAAUA,QAAO,KAAK,IAAI;AAChC,UAAQ,UAAU,KAAK;AACvB,QAAM,gBAAgB,SAAS;AAAA,IAC7B;AAAA,IACA,cAAc,CAAC,SAAS;AACtB,UAAI,aAAa,QAAS,MAAK,QAAQ,QAAQ,IAAI;AAAA,UAC9C,cAAa,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,IAC5C;AAAA,EACF,CAAC;AACD,QAAM,eAAe,KAAK,QAAQ;AAClC,QAAM,iBAAiB,SAAS,cAAc,aAAa,cAAc,QAAQ;AACjF,QAAM,QAAQ,KAAK,QAAQ,SAAS,KAAK,aAAa,iBAAiB;AACvE,QAAM,aAAa,UAAU,SAAS,SAAY,UAAU,SAAS,SAAS;AAC9E,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,iBAAiB,MAAM;AAC3B,kBAAc,gBAAgB;AAC9B,kBAAc,aAAa;AAC3B,iBAAa,KAAK;AAAA,EACpB;AAEA,QAAM,QACJ,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,YAAY,aAAa,IAAI,IAAI,YAAY,SAAS;AAAA,MACpE,cAAY;AAAA,MACZ,cAAY;AAAA,MAEZ;AAAA,wBAAAA,MAAC,YAAO,WAAU,kBAChB;AAAA,0BAAAA,MAAC,SAAI,WAAU,mBACZ;AAAA,iBAAK,QAAQ,eAAe,YAC3B,gBAAAD,KAAC,SAAI,KAAK,KAAK,OAAO,eAAe,UAAU,KAAI,IAAG;AAAA,YAExD,gBAAAC,MAAC,SACC;AAAA,8BAAAD,KAAC,SAAI,WAAU,kBAAkB,iBAAM;AAAA,cACtC,KAAK,QAAQ,eACZ,gBAAAA,KAAC,SAAI,WAAU,kBAAkB,eAAK,OAAO,aAAY;AAAA,eAE7D;AAAA,aACF;AAAA,UACC,SAAS,YACR,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,QAAQ,KAAK;AAAA,cAC5B,cAAY,EAAE,QAAQ,OAAO;AAAA,cAC9B;AAAA;AAAA,UAED;AAAA,WAEJ;AAAA,QAEC,KAAK,YACJ,gBAAAC,MAAC,SAAI,WAAU,mBACb;AAAA,0BAAAD,KAAC,OAAG,eAAK,WAAU;AAAA,UACnB,gBAAAA,KAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAM,KAAK,KAAK,OAAO,GACjE,YAAE,UAAU,OAAO,GACtB;AAAA,WACF,IACE,KAAK,WACP,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,YAAY,KAAK;AAAA,YACjB,eAAe,KAAK;AAAA,YACpB,cAAc,KAAK;AAAA;AAAA,QACrB,IACE,CAAC,KAAK,SACR,gBAAAA,KAAC,SAAI,WAAU,mBACb,0BAAAA,KAAC,WAAQ,OAAO,EAAE,UAAU,SAAS,GAAG,GAC1C,IACE,YACF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,KAAK;AAAA,YACf,MAAM,KAAK;AAAA,YACX,OAAO;AAAA,YACP,cAAc,cAAc,QAAQ;AAAA,YACpC,QAAQ;AAAA;AAAA,QACV,IAEA,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,KAAK;AAAA,cACf,SAAS,KAAK,OAAO,eAAe,kBAAkB,EAAE,QAAQ,SAAS;AAAA,cACzE,UAAU,CAAC,WAAW,KAAK,KAAK,KAAK,MAAM;AAAA;AAAA,UAC7C;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,QAAQ,KAAK;AAAA,cACb,QAAQ,KAAK;AAAA,cACb;AAAA,cACA,OACE,iBACI;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB,OAAO,cAAc;AAAA,gBACrB,OAAO,cAAc;AAAA,gBACrB,MAAM,cAAc;AAAA,gBACpB,aAAa,MAAM,aAAa,IAAI;AAAA,cACtC,IACA;AAAA;AAAA,UAER;AAAA,WACF;AAAA,QAEF,gBAAAA,KAAC,YAAO,WAAU,kBAChB,0BAAAA,KAAC,OAAE,MAAK,2BAA0B,QAAO,UAAS,KAAI,cACnD,YAAE,QAAQ,WAAW,GACxB,GACF;AAAA;AAAA;AAAA,EACF;AAGF,MAAI,SAAS,SAAU,QAAO;AAE9B,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,cAAc,eAAe,QAAQ,IAAI,UAAU;AAAA,MACjE,cAAY;AAAA,MAEX;AAAA,gBAAQ;AAAA,QACT,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,GAAG,wBAAwB,QAAQ,4BAA4B;AAAA,YAC1E,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,YAChC,iBAAe;AAAA,YACf,cAAY,OAAO,EAAE,QAAQ,OAAO,IAAI,EAAE,QAAQ,MAAM;AAAA,YAExD;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,aAAY;AAAA,kBACZ,eAAc;AAAA,kBACd,gBAAe;AAAA,kBACf,eAAY;AAAA,kBAEZ;AAAA,oCAAAD,KAAC,UAAK,GAAE,sHAAqH;AAAA,oBAC7H,gBAAAA,KAAC,UAAK,GAAE,mBAAkB;AAAA;AAAA;AAAA,cAC5B;AAAA,cACC,CAAC,QAAQ,gBAAAA,KAAC,UAAM,2BAAiB,OAAM;AAAA;AAAA;AAAA,QAC1C;AAAA;AAAA;AAAA,EACF;AAEJ;AAIA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,EAAE,IAAI,WAAW;AACzB,QAAM,SAASG,QAAuB,IAAI;AAC1C,EAAAE,WAAU,MAAM;AACd,WAAO,SAAS,iBAAiB,EAAE,OAAO,MAAM,CAAC;AAAA,EACnD,GAAG,CAAC,CAAC;AACL,SACE,gBAAAJ,MAAC,SAAI,WAAU,sBAAqB,MAAK,OAAM,aAAU,UACvD;AAAA,oBAAAA,MAAC,SAAI,WAAU,8BACb;AAAA,sBAAAD,KAAC,UAAK,WAAU,gBAAgB,YAAE,QAAQ,WAAW,GAAE;AAAA,MACvD,gBAAAA,KAAC,SAAI,WAAU,iBAAiB,mBAAQ;AAAA,OAC1C;AAAA,IACC,SAAS,IAAI,CAAC,MACb,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,GAAG,WAAW,YAAY,EAAE,IAAI,IAAI,EAAE,SAAS,gBAAgB;AAAA,QAE1E;AAAA,0BAAAD,KAAC,UAAK,WAAU,gBACb,YAAE,SAAS,SAAS,EAAE,QAAQ,KAAK,IAAI,EAAE,QAAQ,WAAW,GAC/D;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,iBACZ;AAAA,cAAE,aACD,gBAAAD,KAAC,gBAAa,UAAU,EAAE,YAAY,UAAoB,IACxD,EAAE,UACJ,EAAE,SAAS,eAAe,CAAC,EAAE,QAC3B,gBAAAA,KAAC,YAAS,WAAU,UAAS,MAAM,EAAE,SAAS,IAE9C,gBAAAA,KAAC,OAAG,YAAE,SAAQ,IAEd,EAAE,YACJ,gBAAAC,MAAC,UAAK,WAAU,qBACd;AAAA,8BAAAD,KAAC,WAAQ,OAAO,EAAE,QAAQ,UAAU,GAAG;AAAA,cAAE;AAAA,cAAE,EAAE,QAAQ,UAAU;AAAA,eACjE,IACE;AAAA,YACH,EAAE,eAAe,EAAE,YAAY,SAAS,KACvC,gBAAAA,KAAC,QAAG,WAAU,kBAAiB,cAAY,EAAE,QAAQ,aAAa,GAC/D,YAAE,YAAY,IAAI,CAAC,MAAM,MACxB,gBAAAC,MAAC,QAAW,WAAU,YACpB;AAAA,8BAAAD,KAAC,aAAU;AAAA,cACX,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,eAAK,MAAK;AAAA,cAC5C,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,sBAAY,KAAK,IAAI,GAAE;AAAA,iBAHlD,CAIT,CACD,GACH;AAAA,aAEJ;AAAA;AAAA;AAAA,MA/BK,EAAE;AAAA,IAgCT,CACD;AAAA,IACD,gBAAAA,KAAC,SAAI,KAAK,QAAQ;AAAA,KACpB;AAEJ;AAEA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,EAAE,IAAI,WAAW;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAS,EAAE;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAA4B,CAAC,CAAC;AACxD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAC9D,QAAM,YAAYC,QAAyB,IAAI;AAG/C,EAAAE,WAAU,MAAM;AACd,QAAI,UAAW,UAAS,CAAC,MAAO,EAAE,KAAK,IAAI,GAAG,EAAE,QAAQ,CAAC,IAAI,UAAU,IAAI,KAAK,UAAU,IAAK;AAAA,EACjG,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,YAAY,OAAO,UAAU;AACnC,QAAM,eAAe,OAAO,UAAU;AAEtC,QAAM,SAAS,CAAC,MAAiB;AAC/B,MAAE,eAAe;AACjB,QAAI,KAAM;AACV,UAAM,OAAO;AACb,UAAM,WAAW;AACjB,aAAS,EAAE;AACX,aAAS,CAAC,CAAC;AACX,iBAAa,IAAI;AACjB,SAAK,OAAO,MAAM,QAAQ;AAAA,EAC5B;AAEA,QAAM,OAAO,OAAO,MAAqC;AACvD,UAAM,SAAS,MAAM,KAAK,EAAE,OAAO,SAAS,CAAC,CAAC;AAC9C,MAAE,OAAO,QAAQ;AACjB,QAAI,OAAO,WAAW,EAAG;AACzB,QAAI,MAAM,SAAS,OAAO,SAAS,kBAAkB,UAAU;AAC7D,mBAAa,EAAE,QAAQ,cAAc,CAAC;AACtC;AAAA,IACF;AACA,QAAI,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,kBAAkB,QAAQ,GAAG;AACjE,mBAAa,EAAE,QAAQ,cAAc,CAAC;AACtC;AAAA,IACF;AACA,iBAAa,IAAI;AACjB,UAAM,WAAW,MAAM,QAAQ,IAAI,OAAO,IAAI,QAAQ,CAAC;AACvD,aAAS,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;AAAA,EAC3C;AAEA,QAAM,UAAU,MAAM,KAAK,EAAE,SAAS,KAAK,MAAM,SAAS;AAE1D,SACE,gBAAAJ,MAAC,UAAK,WAAU,sBAAqB,UAAU,QAC3C;AAAA,WAAM,SAAS,KAAK,cACpB,gBAAAA,MAAC,SAAI,WAAU,qBACZ;AAAA,YAAM,IAAI,CAAC,MAAM,MAChB,gBAAAA,MAAC,UAAa,WAAU,8BACtB;AAAA,wBAAAD,KAAC,aAAU;AAAA,QACX,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,eAAK,MAAK;AAAA,QAC5C,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAY,GAAG,EAAE,QAAQ,YAAY,CAAC,KAAK,KAAK,IAAI;AAAA,YACpD,SAAS,MAAM,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;AAAA,YACjE;AAAA;AAAA,QAED;AAAA,WAVS,CAWX,CACD;AAAA,MACA,aAAa,gBAAAA,KAAC,UAAK,WAAU,wBAAwB,qBAAU;AAAA,OAClE;AAAA,IAED,OAAO,SAAS,gBAAAA,KAAC,SAAI,WAAU,wBAAwB,gBAAM,OAAM;AAAA,IACpE,gBAAAC,MAAC,SAAI,WAAU,iBACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,UAAQ;AAAA,UACR,QAAM;AAAA,UACN,UAAU;AAAA,UACV,eAAY;AAAA;AAAA,MACd;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,cAAY,EAAE,QAAQ,QAAQ;AAAA,UAC9B,OAAO,EAAE,QAAQ,QAAQ;AAAA,UACzB,UAAU;AAAA,UACV,SAAS,MAAM,UAAU,SAAS,MAAM;AAAA,UAExC,0BAAAA,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACtE,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB,GACF;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,aAAa,EAAE,QAAQ,aAAa;AAAA,UACpC,cAAY,EAAE,QAAQ,aAAa;AAAA,UACnC,cAAa;AAAA;AAAA,MACf;AAAA,MACC,SACC,gBAAAC,MAAAF,WAAA,EACE;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW,GAAG,iBAAiB,aAAa,mBAAmB;AAAA,YAC/D,cAAY,YAAY,EAAE,SAAS,aAAa,IAAI,EAAE,SAAS,SAAS;AAAA,YACxE,gBAAc;AAAA,YACd,OAAO,YAAY,EAAE,SAAS,aAAa,IAAI,EAAE,SAAS,SAAS;AAAA,YACnE,UAAU,QAAQ;AAAA,YAClB,SAAS,MAAO,YAAY,MAAM,KAAK,IAAI,KAAK,MAAM,MAAM;AAAA,YAE3D,yBAAe,gBAAAA,KAAC,WAAQ,OAAO,EAAE,SAAS,cAAc,GAAG,IAAK,gBAAAA,KAAC,YAAS;AAAA;AAAA,QAC7E;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,cAAY,EAAE,SAAS,WAAW;AAAA,YAClC,OAAO,EAAE,SAAS,WAAW;AAAA,YAC7B,UAAU,QAAQ,aAAa;AAAA,YAC/B,SAAS,MAAM;AAAA,YAEf,0BAAAA,KAAC,gBAAa;AAAA;AAAA,QAChB;AAAA,SACF;AAAA,MAED,OACC,gBAAAA,KAAC,UAAO,SAAQ,WAAU,SAAS,QAChC,YAAE,QAAQ,MAAM,GACnB,IAEA,gBAAAA,KAAC,UAAO,SAAQ,UAAS,MAAK,UAAS,UAAU,CAAC,SAC/C,YAAE,QAAQ,MAAM,GACnB;AAAA,OAEJ;AAAA,KACF;AAEJ;AAOA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,EAAE,IAAI,WAAW;AACzB,QAAM,YAAYG,QAAsB,IAAI;AAC5C,QAAM,aAAaA,QAAO,IAAI;AAC9B,QAAM,gBAAgB,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AAChF,QAAM,WAAW,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAItE,EAAAE,WAAU,MAAM;AACd,eAAW,UAAU;AACrB,cAAU,UAAU,eAAe,MAAM;AACzC,SAAK,MAAM,eAAe;AAC1B,WAAO,MAAM;AACX,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,eAAe;AAC/B,QAAM,iBAAiB,eAAe,cAAc;AAEpD,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,kBAAkB,YAAY,UAAU,QAAS;AACvE,cAAU,UAAU,WAAW;AAC/B,UAAM,MAAM,YAAY;AACtB,UAAI,gBAAgB,cAAc,WAAW,CAAC,cAAc,OAAO;AACjE,cAAM,MAAM,MAAM,cAAc,OAAO;AAAA,MACzC;AACA,UAAI,WAAW,QAAS,OAAM,MAAM,eAAe;AAAA,IACrD;AACA,SAAK,IAAI;AAAA,EACX,GAAG,CAAC,SAAS,cAAc,CAAC;AAE5B,QAAM,SACJ,MAAM,UAAU,cACZ,EAAE,SAAS,WAAW,IACtB,MAAM,UAAU,iBACd,EAAE,SAAS,cAAc,IACzB,MAAM,UAAU,aACd,EAAE,SAAS,UAAU,IACrB,OACE,EAAE,SAAS,UAAU,IACrB,EAAE,SAAS,MAAM;AAE7B,QAAM,OACJ,MAAM,UAAU,cACZ,EAAE,SAAS,aAAa,IACxB,MAAM,UAAU,aACd,EAAE,SAAS,WAAW,IACtB,MAAM,UAAU,kBAAkB,OAChC,KACA,EAAE,SAAS,MAAM;AAE3B,QAAM,MAAM,MAAM;AAChB,QAAI,MAAM,UAAU,YAAa,OAAM,cAAc;AAAA,aAC5C,MAAM,UAAU,YAAY;AACnC,YAAM,aAAa;AACnB,WAAK,MAAM,eAAe;AAAA,IAC5B,WAAW,MAAM,UAAU,UAAU,CAAC,KAAM,MAAK,MAAM,eAAe;AAAA,EACxE;AAEA,SACE,gBAAAJ,MAAC,aAAQ,WAAU,aAAY,cAAY,EAAE,SAAS,WAAW,GAC/D;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,cAAY,EAAE,SAAS,MAAM;AAAA,QAC9B;AAAA;AAAA,IAED;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAU,qBAAoB,aAAU,UAC1C,kBACH;AAAA,IACC,UAAU,WAAW,gBAAAA,KAAC,OAAE,WAAU,kBAAkB,mBAAS,SAAQ;AAAA,IACtE,gBAAAA,KAAC,SAAI,WAAU,oBACZ,yBAAe,UACd,gBAAAA,KAAC,YAAS,WAAU,UAAS,MAAM,cAAc,SAAS,IACxD,OACF,gBAAAA,KAAC,WAAQ,OAAO,EAAE,SAAS,UAAU,GAAG,IACtC,MACN;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,mBAAmB,MAAM,KAAK;AAAA,UAC9B,QAAQ;AAAA,QACV;AAAA,QACA,OAAO,EAAE,CAAC,aAAuB,GAAG,MAAM,MAAM;AAAA,QAChD,SAAS;AAAA,QACT,cAAY,QAAQ;AAAA,QACpB,UAAU,MAAM,UAAU,kBAAkB,MAAM,UAAU;AAAA,QAE5D,0BAAAA,KAAC,YAAS,MAAM,IAAI;AAAA;AAAA,IACtB;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAU,mBAAmB,gBAAK;AAAA,IACtC,MAAM,SAAS,gBAAAA,KAAC,SAAI,WAAU,oBAAoB,gBAAM,OAAM;AAAA,KACjE;AAEJ;AAEA,SAAS,SAAS,EAAE,OAAO,GAAG,GAAsB;AAClD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,KAAI;AAAA,QAC/C,gBAAAA,KAAC,UAAK,GAAE,uCAAsC;AAAA;AAAA;AAAA,EAChD;AAEJ;AAEA,SAAS,eAAe;AACtB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,UAAK,GAAE,6BAA4B;AAAA,QACpC,gBAAAA,KAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,KAAI,QAAO,KAAI,IAAG,OAAM;AAAA,QACjD,gBAAAA,KAAC,UAAK,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,KAAI,IAAG,OAAM;AAAA,QAClD,gBAAAA,KAAC,UAAK,GAAE,6BAA4B;AAAA;AAAA;AAAA,EACtC;AAEJ;AAEA,SAAS,SAAS,MAAsC;AACtD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,MACd,QAAQ;AAAA,MACN,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,QAAQ;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,MAAM,OAAO,OAAO,MAAM;AAAA,MAC1B,cAAc,KAAK;AAAA,IACrB,CAAC;AACH,WAAO,UAAU,MAAM,OAAO,OAAO,KAAK;AAC1C,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACH;AAEA,SAAS,YAAY,MAAsB;AACzC,MAAI,OAAO,KAAM,QAAO,GAAG,IAAI;AAC/B,MAAI,OAAO,OAAO,KAAM,QAAO,IAAI,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC1D,SAAO,IAAI,QAAQ,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC7C;AAEA,SAAS,YAAY;AACnB,SACE,gBAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACtE;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA;AAAA,IACjB;AAAA,IACA,gBAAAA,KAAC,UAAK,GAAE,aAAY,QAAO,gBAAe,aAAY,OAAM,gBAAe,SAAQ;AAAA,KACrF;AAEJ;AAEA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,EAAE,GAAG,OAAO,IAAI,WAAW;AAEjC,MAAI,SAAS,OAAO;AAClB,WACE,gBAAAC,MAAC,SAAI,WAAU,mBACb;AAAA,sBAAAD,KAAC,QAAI,YAAE,QAAQ,UAAU,GAAE;AAAA,MAC3B,gBAAAA,KAAC,OAAG,YAAE,QAAQ,SAAS,GAAE;AAAA,MACzB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,SAAS,MAAM,OAAO,KAAK,GAAG,OAAO,OAAO,UAAU,UAAU,UAAU;AAAA,UAEzE,YAAE,QAAQ,WAAW;AAAA;AAAA,MACxB;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,SAAS,SAAS;AACpB,WAAO,gBAAAA,KAAC,aAAU,eAA8B,cAA4B;AAAA,EAC9E;AAEA,SAAO,gBAAAA,KAAC,gBAAa,YAAwB;AAC/C;AAEA,SAAS,aAAa;AAAA,EACpB;AACF,GAEG;AACD,QAAM,EAAE,EAAE,IAAI,WAAW;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAS,EAAE;AACrC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,SAAS,OAAO,MAAiB;AACrC,MAAE,eAAe;AACjB,eAAW,IAAI;AACf,aAAS,IAAI;AACb,UAAM,KAAK,MAAM,WAAW,EAAE,UAAU,MAAM,CAAC;AAC/C,eAAW,KAAK;AAChB,QAAI,CAAC,GAAI,UAAS,EAAE,QAAQ,iBAAiB,CAAC;AAAA,EAChD;AAEA,SACE,gBAAAD,MAAC,UAAK,WAAU,kCAAiC,UAAU,QACzD;AAAA,oBAAAD,KAAC,QAAI,YAAE,QAAQ,eAAe,GAAE;AAAA,IAChC,gBAAAA,KAAC,OAAG,YAAE,QAAQ,cAAc,GAAE;AAAA,IAC9B,gBAAAA,KAAC,SAAM,OAAO,EAAE,QAAQ,UAAU,GAAG,OAAO,SAAS,QACnD,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC,UAAQ;AAAA,QACR,cAAa;AAAA;AAAA,IACf,GACF;AAAA,IACA,gBAAAA,KAAC,UAAO,SAAQ,UAAS,MAAK,UAAS,UAAU,WAAW,CAAC,OAC1D,YAAE,QAAQ,UAAU,GACvB;AAAA,KACF;AAEJ;AAMA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,EAAE,IAAI,WAAW;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAIE,UAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,EAAE;AACnC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAA2B,OAAO;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAwB,IAAI;AACxD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,UAAU,YAAY;AAC1B,eAAW,IAAI;AACf,aAAS,IAAI;AACb,cAAU,IAAI;AACd,UAAM,SAAS,MAAM,cAAc,MAAM,KAAK,CAAC;AAC/C,eAAW,KAAK;AAChB,QAAI,WAAW,QAAQ;AACrB,cAAQ,MAAM;AACd,gBAAU,EAAE,QAAQ,UAAU,CAAC;AAAA,IACjC,OAAO;AACL,eAAS,EAAE,QAAQ,WAAW,iBAAiB,iBAAiB,WAAW,CAAC;AAAA,IAC9E;AAAA,EACF;AAEA,QAAM,SAAS,YAAY;AACzB,eAAW,IAAI;AACf,aAAS,IAAI;AACb,cAAU,IAAI;AACd,UAAM,KAAK,MAAM,aAAa,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC;AACvD,eAAW,KAAK;AAChB,QAAI,CAAC,GAAI,UAAS,EAAE,QAAQ,aAAa,CAAC;AAAA,EAC5C;AAEA,QAAM,SAAS,CAAC,MAAiB;AAC/B,MAAE,eAAe;AACjB,UAAM,SAAS,UAAU,QAAQ,IAAI,OAAO;AAAA,EAC9C;AAEA,MAAI,SAAS,QAAQ;AACnB,WACE,gBAAAD,MAAC,UAAK,WAAU,kCAAiC,UAAU,QACzD;AAAA,sBAAAD,KAAC,QAAI,YAAE,QAAQ,YAAY,GAAE;AAAA,MAC7B,gBAAAC,MAAC,OACE;AAAA,UAAE,QAAQ,UAAU;AAAA,QAAE;AAAA,QAAC,gBAAAD,KAAC,YAAQ,iBAAM;AAAA,SACzC;AAAA,MACA,gBAAAA,KAAC,SAAM,OAAO,EAAE,QAAQ,MAAM,GAAG,OAAO,SAAS,QAAW,MAAM,UAAU,QAC1E,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,cAAa;AAAA,UACb,SAAQ;AAAA,UACR,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,UAC1D,UAAQ;AAAA;AAAA,MACV,GACF;AAAA,MACA,gBAAAC,MAAC,SAAI,WAAU,0BACb;AAAA,wBAAAD,KAAC,UAAO,SAAQ,UAAS,MAAK,UAAS,UAAU,WAAW,KAAK,WAAW,GACzE,YAAE,QAAQ,QAAQ,GACrB;AAAA,QACA,gBAAAA,KAAC,UAAO,SAAQ,SAAQ,MAAK,UAAS,UAAU,SAAS,SAAS,MAAM,KAAK,QAAQ,GAClF,YAAE,QAAQ,QAAQ,GACrB;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM;AACb,sBAAQ,OAAO;AACf,sBAAQ,EAAE;AACV,uBAAS,IAAI;AACb,wBAAU,IAAI;AAAA,YAChB;AAAA,YAEC,YAAE,QAAQ,MAAM;AAAA;AAAA,QACnB;AAAA,SACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,UAAK,WAAU,kCAAiC,UAAU,QACzD;AAAA,oBAAAD,KAAC,QAAI,YAAE,QAAQ,YAAY,GAAE;AAAA,IAC7B,gBAAAA,KAAC,OAAG,YAAE,QAAQ,WAAW,GAAE;AAAA,IAC3B,gBAAAA,KAAC,SAAM,OAAO,EAAE,QAAQ,OAAO,GAAG,OAAO,SAAS,QAChD,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,QACxC,UAAQ;AAAA,QACR,cAAa;AAAA;AAAA,IACf,GACF;AAAA,IACA,gBAAAA,KAAC,UAAO,SAAQ,UAAS,MAAK,UAAS,UAAU,WAAW,CAAC,MAAM,KAAK,GACrE,YAAE,QAAQ,UAAU,GACvB;AAAA,KACF;AAEJ;;;AIr+BQ,SACE,OAAAO,MADF,QAAAC,aAAA;AARD,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA2D;AACzD,SACE,gBAAAD,KAAC,SAAI,WAAW,GAAG,aAAa,SAAS,GAAI,GAAG,OAC7C,gBAAM,IAAI,CAAC,MACV,gBAAAC,MAAC,SAAkB,WAAU,6BAC3B;AAAA,oBAAAD,KAAC,SAAI,WAAW,GAAG,eAAe,EAAE,QAAQ,EAAE,SAAS,aAAa,MAAM,EAAE,IAAI,EAAE,GAC/E,YAAE,OACL;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAU,eAAe,YAAE,OAAM;AAAA,IACrC,EAAE,SAAS,gBAAAA,KAAC,SAAI,WAAU,oBAAoB,YAAE,OAAM;AAAA,OAL/C,EAAE,KAMZ,CACD,GACH;AAEJ;AAoBA,IAAM,MAAM,CAAC,MAAc,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAE3C,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,aAAa,EAAE,MAAM,MAAM,KAAK,KAAK;AAAA,EACrC,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,OACJ,WAAW,MAAM,KAAK,EAAE,QAAQ,KAAK,CAAC,GAAG,OAAO,UAAU,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,IAAI,CAAC,CAAC;AACxF,SACE,gBAAAC,MAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAC7C;AAAA,oBAAAA,MAAC,WAAM,WAAU,mBACf;AAAA,sBAAAD,KAAC,WACC,0BAAAC,MAAC,QACC;AAAA,wBAAAD,KAAC,QAAG,WAAU,mBAAkB;AAAA,QAC/B,KAAK,IAAI,CAAC,MACT,gBAAAA,KAAC,QAAW,WAAU,iBAAgB,OAAM,OACzC,eADM,CAET,CACD;AAAA,SACH,GACF;AAAA,MACA,gBAAAA,KAAC,WACE,eAAK,IAAI,CAAC,MACT,gBAAAC,MAAC,QACC;AAAA,wBAAAD,KAAC,QAAG,WAAU,mBAAkB,OAAM,OACnC,YAAE,OACL;AAAA,QACC,EAAE,OAAO,IAAI,CAAC,GAAG,MAAM;AACtB,gBAAM,OACJ,MAAM,OACF,SACA,IAAI,WAAW,MACb,QACA,IAAI,WAAW,OACb,SACA;AACV,iBACE,gBAAAA,KAAC,QAAW,WAAU,gBACpB,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,GAAG,kBAAkB,MAAM,IAAI,EAAE;AAAA,cAC5C,OAAO,MAAM,OAAO,WAAM,OAAO,CAAC;AAAA,cAClC,OACE,MAAM,OACF,SACA,EAAE,SAAS,OAAO,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,EAAE;AAAA;AAAA,UAE3E,KATO,CAUT;AAAA,QAEJ,CAAC;AAAA,WA1BM,EAAE,KA2BX,CACD,GACH;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,oBACb;AAAA,sBAAAA,MAAC,OAAI,MAAK,MAAK;AAAA;AAAA,QAAG,IAAI,WAAW,IAAI;AAAA,SAAE;AAAA,MACvC,gBAAAA,MAAC,OAAI,MAAK,QAAO;AAAA;AAAA,QAAG,IAAI,WAAW,GAAG;AAAA,SAAE;AAAA,MACxC,gBAAAA,MAAC,OAAI,MAAK,OAAM;AAAA;AAAA,QAAM,IAAI,WAAW,GAAG;AAAA,SAAE;AAAA,OAC5C;AAAA,KACF;AAEJ;AA2BA,IAAM,QAA2D;AAAA,EAC/D,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,IAAM,QAAQ,CAAC,MAAe,IAAI,MAAO,GAAG,KAAK,MAAM,CAAC,CAAC,QAAQ,IAAI,IAAI,KAAM,QAAQ,CAAC,CAAC;AAQlF,SAAS,YAAY,EAAE,OAAO,SAAS,WAAW,GAAG,MAAM,GAAqB;AACrF,QAAM,MAAM,WAAW,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACvF,SACE,gBAAAD,KAAC,QAAG,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,OAC/C,gBAAM,IAAI,CAAC,MACV,gBAAAC;AAAA,IAAC;AAAA;AAAA,MAEC,WAAW,GAAG,sBAAsB,MAAM,EAAE,MAAM,IAAI,EAAE,QAAQ,KAAK,EAAE,IAAI,EAAE;AAAA,MAE7E;AAAA,wBAAAD,KAAC,UAAK,WAAU,uBAAsB,eAAY,QAC/C,YAAE,OAAO,MAAM,EAAE,IAAI,IAAI,UAC5B;AAAA,QACA,gBAAAC,MAAC,UAAK,WAAU,sBACb;AAAA,YAAE;AAAA,UACF,EAAE,UAAU,gBAAAD,KAAC,UAAK,WAAU,wBAAwB,YAAE,QAAO;AAAA,WAChE;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,qBAAoB,eAAY,QAC9C,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,MAAM,GAAI,EAAE,UAAU,MAAO,GAAG;AAAA,cAChC,OAAO,GAAG,KAAK,IAAI,IAAK,EAAE,cAAc,KAAK,MAAO,GAAG,CAAC;AAAA,YAC1D;AAAA;AAAA,QACF,GACF;AAAA,QACA,gBAAAC,MAAC,UAAK,WAAU,sBACb;AAAA,YAAE,eAAe,UAAa,MAAM,EAAE,UAAU;AAAA,UAChD,EAAE,WAAW,UAAa,SAAM,EAAE,MAAM;AAAA,UACxC,EAAE,YAAY,UAAa,UAAO,EAAE,QAAQ,QAAQ,CAAC,CAAC;AAAA,WACzD;AAAA;AAAA;AAAA,IAvBK,EAAE;AAAA,EAwBT,CACD,GACH;AAEJ;AAiBA,IAAM,MAAM,CAAC,MAAc,IAAI,EAAE,QAAQ,CAAC,CAAC;AAEpC,SAAS,SAAS,EAAE,OAAO,SAAS,KAAK,WAAW,GAAG,MAAM,GAAkB;AACpF,QAAM,MAAM,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACvD,SACE,gBAAAD,KAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAC5C,gBAAM,IAAI,CAAC,GAAG,QACb,gBAAAC,MAAC,SAAkB,WAAU,iBAC3B;AAAA,oBAAAD,KAAC,UAAK,WAAU,mBAAmB,YAAE,OAAM;AAAA,IAC3C,gBAAAA,KAAC,UAAK,WAAU,mBAAkB,eAAY,QAC5C,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO,GAAI,EAAE,QAAQ,MAAO,GAAG;AAAA,UAC/B,YAAY,cAAe,MAAM,IAAK,CAAC;AAAA,QACzC;AAAA;AAAA,IACF,GACF;AAAA,IACA,gBAAAC,MAAC,UAAK,WAAU,mBACb;AAAA,aAAO,EAAE,KAAK;AAAA,MACd,EAAE,QAAQ,gBAAAD,KAAC,UAAK,WAAU,kBAAkB,YAAE,MAAK;AAAA,OACtD;AAAA,OAdQ,EAAE,KAeZ,CACD,GACH;AAEJ;;;ACrPA,SAAyB,eAAAE,cAAa,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;;;AC+BzE,gBAAuB,SACrB,QACA,YACA,SACA,QAC0B;AAC1B,QAAM,MAAM,MAAM,OAAO,SAAS,kBAAkB,mBAAmB,UAAU,CAAC,YAAY;AAAA,IAC5F,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa,QAAQ;AAAA,MACrB,qBAAqB;AAAA,IACvB;AAAA,IACA,aAAa;AAAA,IACb,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO,QAAQ;AAAA,MACf,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,iBAAiB,QAAQ;AAAA,IAC3B,CAAC;AAAA,IACD;AAAA,EACF,CAAC;AACD,QAAM,cAAc,IAAI,QAAQ,IAAI,gBAAgB,KAAK;AACzD,MAAI,CAAC,IAAI,IAAI;AACX,QAAI,UAAU,QAAQ,IAAI,MAAM;AAChC,QAAI;AACF,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAI,KAAK,MAAO,WAAU,KAAK;AAAA,IACjC,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,aAAa,SAAS,IAAI,QAAQ,IAAI,WAAW,MAAM,iBAAiB,MAAS;AAAA,EAC7F;AACA,QAAM,EAAE,MAAM,WAAW,YAAY;AACrC,QAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,MAAI,CAAC,YAAY,SAAS,mBAAmB,GAAG;AAC9C,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAI,KAAK,YAAY,MAAO,OAAM,EAAE,MAAM,SAAS,SAAS,KAAK,SAAS,aAAa;AAAA,QAClF,OAAM,EAAE,MAAM,QAAQ,QAAQ,KAAK,UAAU,MAAM,SAAS,KAAK;AACtE;AAAA,EACF;AACA,SAAO,YAAY,IAAI,IAAkC;AAC3D;AAGA,gBAAuB,YAAY,QAA8D;AAC/F,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAI,MAAM,OAAO,QAAQ,MAAM;AAC/B,aAAO,QAAQ,IAAI;AACjB,cAAM,KAAK,eAAe,OAAO,MAAM,GAAG,GAAG,CAAC;AAC9C,iBAAS,OAAO,MAAM,MAAM,CAAC;AAC7B,YAAI,IAAI;AACN,cAAI,GAAG,SAAS,UAAU,GAAG,SAAS,QAAS,YAAW;AAC1D,gBAAM;AAAA,QACR;AACA,cAAM,OAAO,QAAQ,MAAM;AAAA,MAC7B;AAAA,IACF;AACA,UAAM,OAAO,eAAe,MAAM;AAClC,QAAI,MAAM;AACR,UAAI,KAAK,SAAS,UAAU,KAAK,SAAS,QAAS,YAAW;AAC9D,YAAM;AAAA,IACR;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACA,MAAI,CAAC,SAAU,OAAM,EAAE,MAAM,QAAQ,QAAQ,MAAM,SAAS,KAAK;AACnE;AAEA,SAAS,eAAe,OAAgC;AACtD,QAAM,OAAO,MAAM,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AAChE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,MAAI,CAAC,QAAQ,SAAS,SAAU,QAAO;AACvC,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO,EAAE,MAAM,SAAS,MAAM,KAAK;AAAA,EACrC;AACA,QAAM,IAAK,KAAK,QAAQ,CAAC;AACzB,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,MAAM,SAAS,SAAS,EAAE,SAAmB,MAAM,OAAO,EAAE,SAAS,EAAE,EAAE;AAAA,IACpF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,OAAO,EAAE,OAAO;AAAA,QACzB,MAAM,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE;AAAA,QAC7C,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,OAAO,EAAE,OAAO;AAAA,QACzB,MAAM,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE;AAAA,QAC7C,QAAQ;AAAA,QACR,YAAY,EAAE;AAAA,MAChB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,OAAO,EAAE,OAAO;AAAA,QACzB,MAAM,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE;AAAA,QAC7C,QAAQ;AAAA,QACR,YAAY,EAAE;AAAA,MAChB;AAAA,IACF,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,QAAQ,EAAE,QAAQ,SAAS,EAAE,YAAY,MAAM;AAAA,IACxE,KAAK;AACH,aAAO,EAAE,MAAM,SAAS,SAAS,OAAO,EAAE,SAAS,YAAY,EAAE;AAAA,IACnE,KAAK;AACH,aAAO,EAAE,MAAM,SAAS,SAAS,gBAAgB;AAAA,IACnD,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EACX;AAEA,MAAI,KAAK,UAAU,QAAS,QAAO,EAAE,MAAM,SAAS,SAAS,OAAO,KAAK,SAAS,YAAY,EAAE;AAChG,MAAI,KAAK,UAAU,SAAS;AAC1B,UAAM,KAAM,KAAK,QAAQ,CAAC;AAC1B,QAAI,GAAG,YAAY,OAAO;AACxB,YAAM,MAAM,GAAG;AACf,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SACE,OAAO,QAAQ,WAAW,MAAQ,KAA8B,WAAW;AAAA,MAC/E;AAAA,IACF;AACA,WAAO,EAAE,MAAM,QAAQ,QAAQ,GAAG,UAAU,IAAI,SAAS,KAAK;AAAA,EAChE;AACA,MAAI,OAAO,KAAK,UAAU;AACxB,WAAO,EAAE,MAAM,SAAS,SAAS,KAAK,SAA+B,MAAM,KAAK,MAAM;AACxF,SAAO;AACT;;;ADCQ,SACY,OAAAC,MADZ,QAAAC,aAAA;AA3JD,SAAS,YAAY,YAAoB,QAAgB;AAC9D,QAAM,EAAE,QAAQ,EAAE,IAAI,WAAW;AACjC,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAoB,MAAM;AACtD,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,EAAE;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAoB,CAAC,CAAC;AAChD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAkB,IAAI;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA6B;AACnE,QAAM,WAAWC,QAA+B,IAAI;AAEpD,QAAM,SAASC,aAAY,MAAM;AAC/B,aAAS,SAAS,MAAM;AACxB,aAAS,UAAU;AACnB,cAAU,CAAC,MAAO,MAAM,YAAY,SAAS,CAAE;AAAA,EACjD,GAAG,CAAC,CAAC;AAEL,QAAM,MAAMA;AAAA,IACV,OAAO,UAAmB;AACxB,eAAS,SAAS,MAAM;AACxB,YAAM,aAAa,IAAI,gBAAgB;AACvC,eAAS,UAAU;AACnB,gBAAU,SAAS;AACnB,cAAQ,EAAE;AACV,eAAS,CAAC,CAAC;AACX,gBAAU,IAAI;AACd,eAAS,IAAI;AACb,UAAI;AACF,yBAAiB,MAAM,SAAS,QAAQ,YAAY,EAAE,QAAQ,MAAM,GAAG,WAAW,MAAM,GAAG;AACzF,gBAAM,EAAE;AAAA,QACV;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,WAAW,OAAO,QAAS;AAC/B;AAAA,UACE,eAAe,gBAAgB,IAAI,SAAS,iBACxC,EAAE,OAAO,cAAc,IACvB,eAAe,QACb,IAAI,UACJ,EAAE,OAAO,QAAQ;AAAA,QACzB;AACA,kBAAU,OAAO;AAAA,MACnB,UAAE;AACA,YAAI,SAAS,YAAY,WAAY,UAAS,UAAU;AAAA,MAC1D;AAEA,eAAS,MAAM,IAAc;AAC3B,gBAAQ,GAAG,MAAM;AAAA,UACf,KAAK;AACH,2BAAe,GAAG,WAAW;AAC7B;AAAA,UACF,KAAK;AACH,oBAAQ,CAAC,MAAM,IAAI,GAAG,IAAI;AAC1B;AAAA,UACF,KAAK;AACH,qBAAS,CAAC,SAAS;AACjB,oBAAM,IAAI,KAAK,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;AACxD,oBAAM,OAAgB;AAAA,gBACpB,SAAS,GAAG;AAAA,gBACZ,MAAM,GAAG;AAAA,gBACT,QAAQ,GAAG;AAAA,gBACX,YAAY,GAAG;AAAA,cACjB;AACA,kBAAI,MAAM,GAAI,QAAO,CAAC,GAAG,MAAM,IAAI;AACnC,oBAAM,OAAO,CAAC,GAAG,IAAI;AACrB,mBAAK,CAAC,IAAI;AACV,qBAAO;AAAA,YACT,CAAC;AACD;AAAA,UACF,KAAK;AACH,sBAAU,GAAG,MAAM;AACnB,sBAAU,GAAG,UAAU,SAAS,OAAO;AACvC;AAAA,UACF,KAAK;AACH,qBAAS,GAAG,OAAO;AACnB,sBAAU,OAAO;AACjB;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,YAAY,QAAQ,CAAC;AAAA,EAChC;AAEA,SAAO,EAAE,QAAQ,MAAM,OAAO,QAAQ,OAAO,aAAa,KAAK,OAAO;AACxE;AA6BA,IAAM,iBAA6B;AAAA,EACjC,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,YAAY,UAAU,KAAK;AACpE;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,EAAE,EAAE,IAAI,WAAW;AACzB,QAAM,UAAU,UAAU,KAAK;AAC/B,QAAM,QAAQ,YAAY,YAAY,MAAM;AAC5C,QAAM,CAAC,QAAQ,SAAS,IAAIF;AAAA,IAAoD,MAC9E,OAAO;AAAA,MACL,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,SAAS,YAAY,QAAQ,GAAG,CAAC;AAAA,IACnF;AAAA,EACF;AACA,QAAM,MAAM,CAAC,MAAc,UACzB,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,GAAG,MAAM,EAAE;AAE5C,QAAM,SAAS,OAAO,MAAiB;AACrC,MAAE,eAAe;AACjB,QAAI,MAAM,WAAW,UAAW;AAChC,UAAM,QACJ,OAAO,WAAW,KAAK,OAAO,CAAC,GAAG,SAAS,WAAW,OAAO,CAAC,GAAG,SAAS,aACtE,OAAO,QACP;AACN,UAAM,MAAM,IAAI,KAAK;AAAA,EACvB;AACA,QAAM,cAAcC,QAAO,QAAQ;AACnC,cAAY,UAAU;AACtB,EAAAE,WAAU,MAAM;AACd,QAAI,MAAM,WAAW,OAAQ,aAAY,UAAU,MAAM,MAAM;AAAA,EACjE,GAAG,CAAC,MAAM,QAAQ,MAAM,MAAM,CAAC;AAC/B,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,gBAAAJ,MAAC,SAAM,WAAW,GAAG,WAAW,SAAS,GACrC;AAAA,cAAS,gBACT,gBAAAA,MAAC,YAAO,WAAU,iBACf;AAAA,eAAS,gBAAAD,KAAC,QAAG,WAAU,kBAAkB,iBAAM;AAAA,MAC/C,eAAe,gBAAAA,KAAC,OAAE,WAAU,iBAAiB,uBAAY;AAAA,OAC5D;AAAA,IAEF,gBAAAC,MAAC,UAAK,WAAU,iBAAgB,UAAU,QACvC;AAAA,aAAO,IAAI,CAAC,MACX,gBAAAD,KAAC,SAAmB,OAAO,EAAE,OAC1B,YAAE,SAAS,aACV,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,EAAE;AAAA,UACZ,aAAa,EAAE;AAAA,UACf,OAAO,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,UAClC,UAAU,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,KAAK;AAAA;AAAA,MAC7C,IACE,EAAE,SAAS,WACb,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,UAAU,EAAE;AAAA,UACZ,OAAO,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,UAClC,UAAU,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,KAAK;AAAA,UAE3C;AAAA,4BAAAD,KAAC,YAAO,OAAM,IAAG,oBAAC;AAAA,YACjB,EAAE,SAAS,IAAI,CAAC,MACf,gBAAAA,KAAC,YAAqB,OAAO,EAAE,OAC5B,YAAE,SADQ,EAAE,KAEf,CACD;AAAA;AAAA;AAAA,MACH,IACE,EAAE,SAAS,YACb,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,QAAQ,OAAO,EAAE,IAAI,CAAC;AAAA,UAC/B,UAAU,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,OAAO;AAAA;AAAA,MAC/C,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,EAAE,SAAS,WAAW,WAAW;AAAA,UACvC,UAAU,EAAE;AAAA,UACZ,aAAa,EAAE;AAAA,UACf,OAAO,OAAO,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,UAClC,UAAU,CAAC,MACT,IAAI,EAAE,MAAM,EAAE,SAAS,WAAW,OAAO,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,KAAK;AAAA;AAAA,MAE7E,KAtCQ,EAAE,IAwCd,CACD;AAAA,MACD,gBAAAC,MAAC,SAAI,WAAU,oBACZ;AAAA,cAAM,WAAW,YAChB,gBAAAD,KAAC,UAAO,SAAQ,WAAU,SAAS,MAAM,QACtC,YAAE,OAAO,QAAQ,GACpB,IAEA,gBAAAA,KAAC,UAAO,SAAQ,UAAS,MAAK,UAC3B,yBAAe,EAAE,OAAO,QAAQ,GACnC;AAAA,QAED,MAAM,WAAW,aAChB,gBAAAC,MAAC,UAAK,WAAU,mBACd;AAAA,0BAAAD,KAAC,WAAQ,OAAO,EAAE,OAAO,SAAS,GAAG;AAAA,UAAE;AAAA,UAAE,EAAE,OAAO,SAAS;AAAA,WAC7D;AAAA,QAED,MAAM,WAAW,UAAU,gBAAAA,KAAC,OAAI,MAAK,MAAM,YAAE,OAAO,MAAM,GAAE;AAAA,QAC5D,MAAM,WAAW,WAAW,gBAAAA,KAAC,OAAI,MAAK,OAAO,YAAE,OAAO,OAAO,GAAE;AAAA,SAClE;AAAA,OACF;AAAA,IAEC,MAAM,MAAM,SAAS,KACpB,gBAAAA,KAAC,QAAG,WAAU,kBAAiB,cAAY,EAAE,OAAO,OAAO,GACxD,gBAAM,MAAM,IAAI,CAAC,MAChB,gBAAAC,MAAC,QAAmB,WAAW,oBAAoB,EAAE,MAAM,IACzD;AAAA,sBAAAD,KAAC,UAAK,WAAU,qBAAoB;AAAA,MACpC,gBAAAA,KAAC,UAAK,WAAU,sBAAsB,YAAE,MAAK;AAAA,MAC5C,EAAE,eAAe,UAChB,gBAAAC,MAAC,UAAK,WAAU,sBAAsB;AAAA,UAAE;AAAA,QAAW;AAAA,SAAG;AAAA,SAJjD,EAAE,OAMX,CACD,GACH;AAAA,KAGA,MAAM,QAAQ,MAAM,WAAW,QAAQ,MAAM,UAC7C,gBAAAA,MAAC,aAAQ,WAAU,mBAAkB,aAAU,UAC5C;AAAA,YAAM,SAAS,gBAAAD,KAAC,OAAE,WAAU,kBAAkB,gBAAM,OAAM;AAAA,MAC1D,MAAM,QAAQ,gBAAAA,KAAC,OAAE,WAAU,iBAAiB,gBAAM,MAAK;AAAA,MACvD,CAAC,MAAM,QAAQ,MAAM,WAAW,QAC/B,gBAAAA,KAAC,SAAI,WAAU,mBAAmB,uBAAa,MAAM,MAAM,GAAE;AAAA,MAE9D,MAAM,eACL,gBAAAC,MAAC,OAAE,WAAU,iBACV;AAAA,UAAE,OAAO,WAAW;AAAA,QAAE;AAAA,QAAC,gBAAAD,KAAC,OAAG,gBAAM,aAAY;AAAA,SAChD;AAAA,OAEJ;AAAA,KAEJ;AAEJ;AAEA,SAAS,aAAa,QAAyB;AAC7C,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI;AACF,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC,QAAQ;AACN,WAAO,OAAO,MAAM;AAAA,EACtB;AACF;","names":["body","init","path","useEffect","useMemo","useState","Button","Input","Textarea","jsx","Fragment","jsx","jsxs","useState","useMemo","useEffect","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","Tag","jsx","jsxs","cx","useCallback","useEffect","useRef","useState","useState","useRef","useCallback","useEffect","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","text","jsx","jsxs","useCallback","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useCallback","useEffect"]}