@aginies/webuikit 0.2.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.
@@ -0,0 +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"]}