begeniux 0.1.0 → 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.
- package/README.md +278 -189
- package/dist/copilotkit.cjs +138 -0
- package/dist/copilotkit.cjs.map +1 -0
- package/dist/copilotkit.d.cts +20 -0
- package/dist/copilotkit.d.ts +20 -0
- package/dist/copilotkit.js +102 -0
- package/dist/copilotkit.js.map +1 -0
- package/dist/index.cjs +656 -320
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +266 -47
- package/dist/index.d.ts +266 -47
- package/dist/index.js +652 -315
- package/dist/index.js.map +1 -1
- package/package.json +20 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/BeGenProvider.tsx","../src/BeGenSurface.tsx","../src/useBehaviorTracker.ts","../src/personas.ts","../src/useBeGenContext.ts","../src/classifier/gemini.ts","../src/classifier/heuristic.ts"],"sourcesContent":["import * as React from \"react\";\nimport type { AgentDirective, BehaviorSummary, Variant } from \"./types\";\n\nexport type BeGenContextValue = {\n variant: Variant;\n directive: AgentDirective | null;\n summary: BehaviorSummary | null;\n setVariant: (v: Variant) => void;\n setDirective: (d: AgentDirective) => void;\n setSummary: (s: BehaviorSummary) => void;\n};\n\nexport const BeGenContext = React.createContext<BeGenContextValue | null>(null);\n\nexport function BeGenProvider({ children }: { children: React.ReactNode }) {\n const [variant, setVariant] = React.useState<Variant>(\"neutral\");\n const [directive, setDirective] = React.useState<AgentDirective | null>(null);\n const [summary, setSummary] = React.useState<BehaviorSummary | null>(null);\n\n const value = React.useMemo<BeGenContextValue>(\n () => ({ variant, directive, summary, setVariant, setDirective, setSummary }),\n [variant, directive, summary],\n );\n\n return <BeGenContext.Provider value={value}>{children}</BeGenContext.Provider>;\n}\n","import * as React from \"react\";\nimport type { AgentDirective, BehaviorSummary, ClassifyFn, Variant } from \"./types\";\nimport { useBehaviorTracker } from \"./useBehaviorTracker\";\nimport { BeGenContext } from \"./BeGenProvider\";\nimport { PERSONAS } from \"./personas\";\n\nexport type BeGenSurfaceProps = {\n variants: Record<Variant, React.ComponentType<any>>;\n classify: ClassifyFn;\n variantProps?: Record<string, any>;\n pageContext: BehaviorSummary[\"page_context\"];\n seedPersona?: \"decisive\" | \"deliberate\";\n rateLimitMs?: number;\n className?: string;\n style?: React.CSSProperties;\n children?: never;\n};\n\nexport function BeGenSurface(props: BeGenSurfaceProps) {\n const {\n variants,\n classify,\n variantProps,\n pageContext,\n seedPersona,\n rateLimitMs = 4000,\n className,\n style,\n } = props;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const ctx = React.useContext(BeGenContext);\n\n const [currentVariant, setCurrentVariant] = React.useState<Variant>(\"neutral\");\n const [lastDirective, setLastDirective] = React.useState<AgentDirective | null>(null);\n const [lastSummary, setLastSummary] = React.useState<BehaviorSummary | null>(null);\n\n const lastClassifyAtRef = React.useRef(0);\n const inFlightRef = React.useRef(false);\n const classifyRef = React.useRef(classify);\n React.useEffect(() => {\n classifyRef.current = classify;\n }, [classify]);\n\n const ctxRef = React.useRef(ctx);\n React.useEffect(() => {\n ctxRef.current = ctx;\n }, [ctx]);\n\n const handleFlush = React.useCallback(async (summary: BehaviorSummary) => {\n setLastSummary(summary);\n ctxRef.current?.setSummary(summary);\n\n const now = Date.now();\n if (inFlightRef.current) return;\n if (now - lastClassifyAtRef.current < rateLimitMs) return;\n\n lastClassifyAtRef.current = now;\n inFlightRef.current = true;\n try {\n const directive = await classifyRef.current(summary);\n setLastDirective(directive);\n setCurrentVariant(directive.variant);\n ctxRef.current?.setDirective(directive);\n ctxRef.current?.setVariant(directive.variant);\n } catch {\n // Keep current variant on classifier failure.\n } finally {\n inFlightRef.current = false;\n }\n }, [rateLimitMs]);\n\n const seedTrace = seedPersona ? PERSONAS[seedPersona] : undefined;\n\n useBehaviorTracker({\n containerRef,\n onFlush: handleFlush,\n pageContext,\n seedTrace,\n });\n\n const ActiveComponent = variants[currentVariant] ?? variants.neutral;\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={style}\n data-begen-surface\n data-begen-variant={currentVariant}\n >\n <div\n key={currentVariant}\n style={{\n opacity: 1,\n transition: \"opacity 200ms ease\",\n animation: \"begen-fade-in 200ms ease\",\n }}\n >\n {ActiveComponent ? <ActiveComponent {...(variantProps ?? {})} /> : null}\n </div>\n <BeGenSurfaceStyles />\n {/* Expose directive/summary on a hidden node for debugging */}\n {lastDirective && (\n <span\n style={{ display: \"none\" }}\n data-begen-confidence={lastDirective.confidence}\n data-begen-reasoning={lastDirective.reasoning}\n data-begen-events={lastSummary?.events_seen ?? 0}\n />\n )}\n </div>\n );\n}\n\nconst STYLE_INJECTED = \"__begen_styles__\";\n\nfunction BeGenSurfaceStyles() {\n React.useEffect(() => {\n if (typeof document === \"undefined\") return;\n if ((document as any)[STYLE_INJECTED]) return;\n const tag = document.createElement(\"style\");\n tag.setAttribute(\"data-begen-styles\", \"\");\n tag.textContent = `@keyframes begen-fade-in { from { opacity: 0 } to { opacity: 1 } }`;\n document.head.appendChild(tag);\n (document as any)[STYLE_INJECTED] = true;\n }, []);\n return null;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { BehaviorEvent, BehaviorSummary } from \"./types\";\n\nexport type UseBehaviorTrackerOpts = {\n containerRef: React.RefObject<HTMLElement>;\n flushEveryEvents?: number;\n flushAfterMs?: number;\n bufferSize?: number;\n onFlush: (summary: BehaviorSummary) => void;\n pageContext: BehaviorSummary[\"page_context\"];\n seedTrace?: BehaviorEvent[];\n};\n\nconst RECENT_EVENTS_CAP = 5;\nconst HOVER_MIN_MS = 200;\n\nfunction targetLabel(el: EventTarget | null): string {\n if (!(el instanceof HTMLElement)) return \"unknown\";\n return (\n el.dataset.begenId ||\n el.getAttribute(\"data-product-id\") ||\n el.getAttribute(\"aria-label\") ||\n el.tagName.toLowerCase()\n );\n}\n\nfunction computeSummary(\n buffer: BehaviorEvent[],\n bufferSize: number,\n pageContext: BehaviorSummary[\"page_context\"],\n): BehaviorSummary {\n const now = Date.now();\n const windowStart = now - 60_000;\n\n let clicksLastMin = 0;\n let dwellSum = 0;\n let dwellCount = 0;\n let maxScroll = 0;\n const hoverTargets = new Set<string>();\n\n for (const ev of buffer) {\n if (ev.kind === \"click\" && ev.t >= windowStart) clicksLastMin += 1;\n if (ev.kind === \"dwell\") {\n dwellSum += ev.durationMs;\n dwellCount += 1;\n }\n if (ev.kind === \"scroll\" && ev.depth > maxScroll) maxScroll = ev.depth;\n if (ev.kind === \"hover\") hoverTargets.add(ev.target);\n }\n\n return {\n clicks_per_min: clicksLastMin,\n avg_dwell_ms: dwellCount === 0 ? 0 : Math.round(dwellSum / dwellCount),\n scroll_depth: Math.max(0, Math.min(1, maxScroll)),\n hover_count: hoverTargets.size,\n events_seen: Math.min(buffer.length, bufferSize),\n page_context: pageContext,\n };\n}\n\nexport function useBehaviorTracker(opts: UseBehaviorTrackerOpts): {\n recentEvents: BehaviorEvent[];\n} {\n const {\n containerRef,\n flushEveryEvents = 10,\n flushAfterMs = 5000,\n bufferSize = 50,\n onFlush,\n pageContext,\n seedTrace,\n } = opts;\n\n const bufferRef = useRef<BehaviorEvent[]>([]);\n const sinceFlushRef = useRef(0);\n const lastFlushAtRef = useRef(Date.now());\n const hoverStartRef = useRef<Map<string, number>>(new Map());\n const scrollRafRef = useRef<number | null>(null);\n\n const onFlushRef = useRef(onFlush);\n const pageContextRef = useRef(pageContext);\n useEffect(() => {\n onFlushRef.current = onFlush;\n }, [onFlush]);\n useEffect(() => {\n pageContextRef.current = pageContext;\n }, [pageContext]);\n\n const [recentEvents, setRecentEvents] = useState<BehaviorEvent[]>([]);\n\n const pushEvent = (ev: BehaviorEvent) => {\n const buf = bufferRef.current;\n buf.push(ev);\n if (buf.length > bufferSize) buf.splice(0, buf.length - bufferSize);\n sinceFlushRef.current += 1;\n\n setRecentEvents((prev) => {\n const next = [...prev, ev];\n if (next.length > RECENT_EVENTS_CAP) next.splice(0, next.length - RECENT_EVENTS_CAP);\n return next;\n });\n\n if (sinceFlushRef.current >= flushEveryEvents) {\n flush();\n }\n };\n\n const flush = () => {\n const summary = computeSummary(bufferRef.current, bufferSize, pageContextRef.current);\n sinceFlushRef.current = 0;\n lastFlushAtRef.current = Date.now();\n onFlushRef.current(summary);\n };\n\n useEffect(() => {\n if (seedTrace && seedTrace.length > 0) {\n const buf = bufferRef.current;\n // Rebase t values so the latest seed event aligns with Date.now().\n // Personas use small relative timestamps; this ensures click-per-min\n // and freshness-based metrics see them as recent activity.\n const maxT = seedTrace.reduce((m, e) => (e.t > m ? e.t : m), -Infinity);\n const now = Date.now();\n const offset = Number.isFinite(maxT) ? now - maxT : 0;\n const rebased = seedTrace.map((e) => ({ ...e, t: e.t + offset }));\n buf.push(...rebased);\n if (buf.length > bufferSize) buf.splice(0, buf.length - bufferSize);\n const summary = computeSummary(buf, bufferSize, pageContextRef.current);\n sinceFlushRef.current = 0;\n lastFlushAtRef.current = Date.now();\n onFlushRef.current(summary);\n }\n // mount-only seed\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n const onClick = (e: MouseEvent) => {\n pushEvent({ kind: \"click\", target: targetLabel(e.target), t: Date.now() });\n };\n\n const onMouseOver = (e: MouseEvent) => {\n const label = targetLabel(e.target);\n if (!hoverStartRef.current.has(label)) {\n hoverStartRef.current.set(label, Date.now());\n }\n };\n\n const onMouseOut = (e: MouseEvent) => {\n const label = targetLabel(e.target);\n const started = hoverStartRef.current.get(label);\n if (started == null) return;\n hoverStartRef.current.delete(label);\n const durationMs = Date.now() - started;\n if (durationMs < HOVER_MIN_MS) return;\n const t = Date.now();\n pushEvent({ kind: \"hover\", target: label, durationMs, t });\n pushEvent({ kind: \"dwell\", target: label, durationMs, t });\n };\n\n const computeScrollDepth = () => {\n const rect = el.getBoundingClientRect();\n const viewportH = window.innerHeight || 1;\n const elementH = el.scrollHeight || rect.height || 1;\n const visibleBottom = Math.min(rect.bottom, viewportH);\n const scrolledPast = Math.max(0, visibleBottom - rect.top);\n return Math.max(0, Math.min(1, scrolledPast / elementH));\n };\n\n const onScroll = () => {\n if (scrollRafRef.current != null) return;\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null;\n pushEvent({ kind: \"scroll\", depth: computeScrollDepth(), t: Date.now() });\n });\n };\n\n el.addEventListener(\"click\", onClick);\n el.addEventListener(\"mouseover\", onMouseOver);\n el.addEventListener(\"mouseout\", onMouseOut);\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n\n const interval = window.setInterval(() => {\n if (Date.now() - lastFlushAtRef.current >= flushAfterMs) {\n flush();\n }\n }, Math.max(250, Math.floor(flushAfterMs / 4)));\n\n return () => {\n el.removeEventListener(\"click\", onClick);\n el.removeEventListener(\"mouseover\", onMouseOver);\n el.removeEventListener(\"mouseout\", onMouseOut);\n window.removeEventListener(\"scroll\", onScroll);\n window.clearInterval(interval);\n if (scrollRafRef.current != null) cancelAnimationFrame(scrollRafRef.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef, flushAfterMs, flushEveryEvents, bufferSize]);\n\n return { recentEvents };\n}\n","import type { BehaviorEvent } from \"./types\";\n\n// Persona traces use *relative* t values (ms). The tracker rebases them so the\n// latest event becomes Date.now() at mount, keeping clicks_per_min meaningful.\n\nfunction buildDecisive(): BehaviorEvent[] {\n // ~12 fast clicks across 6 product targets, short dwells, deep scroll.\n const events: BehaviorEvent[] = [];\n const productIds = [\"p-101\", \"p-102\", \"p-103\", \"p-104\", \"p-105\", \"p-106\"];\n let t = 0;\n\n for (let i = 0; i < 12; i++) {\n t += 1500;\n events.push({ kind: \"click\", target: productIds[i % productIds.length], t });\n }\n for (let i = 0; i < 6; i++) {\n t += 800;\n events.push({\n kind: \"dwell\",\n target: productIds[i % productIds.length],\n durationMs: 600 + i * 80,\n t,\n });\n }\n for (let i = 0; i < 6; i++) {\n t += 1200;\n events.push({\n kind: \"scroll\",\n depth: Math.min(0.95, 0.4 + i * 0.1),\n t,\n });\n }\n for (let i = 0; i < 2; i++) {\n t += 600;\n events.push({\n kind: \"hover\",\n target: productIds[i],\n durationMs: 250,\n t,\n });\n }\n\n return events;\n}\n\nfunction buildDeliberate(): BehaviorEvent[] {\n // ~3 clicks across 6 distinct hover targets, long dwells, modest scroll.\n const events: BehaviorEvent[] = [];\n const productIds = [\"p-201\", \"p-202\", \"p-203\", \"p-204\", \"p-205\", \"p-206\"];\n let t = 0;\n\n for (let i = 0; i < 6; i++) {\n t += 5500;\n const target = productIds[i];\n events.push({ kind: \"hover\", target, durationMs: 1800 + i * 200, t });\n t += 200;\n events.push({\n kind: \"dwell\",\n target,\n durationMs: 5000 + i * 400,\n t,\n });\n }\n for (let i = 0; i < 3; i++) {\n t += 4000;\n events.push({ kind: \"click\", target: productIds[i], t });\n }\n for (let i = 0; i < 5; i++) {\n t += 1500;\n events.push({\n kind: \"scroll\",\n depth: Math.min(0.6, 0.2 + i * 0.08),\n t,\n });\n }\n\n return events;\n}\n\nexport const PERSONAS: Record<\"decisive\" | \"deliberate\", BehaviorEvent[]> = {\n get decisive() {\n return buildDecisive();\n },\n get deliberate() {\n return buildDeliberate();\n },\n};\n","import * as React from \"react\";\nimport { BeGenContext, type BeGenContextValue } from \"./BeGenProvider\";\n\nexport function useBeGenContext(): BeGenContextValue {\n const ctx = React.useContext(BeGenContext);\n if (!ctx) {\n throw new Error(\"useBeGenContext must be used inside <BeGenProvider>\");\n }\n return ctx;\n}\n","import type { AgentDirective, ClassifyFn, Variant } from \"../types\";\n\nconst CLASSIFIER_SYSTEM_PROMPT = `\nYou classify e-commerce shopper behavior into UI variants.\n\nYou receive a JSON object describing a user's recent interaction pattern on\na product listing page. Decide which UI variant best serves them right now.\n\nVariants:\n- \"decisive\": user knows what they want; minimize friction. Dense grid,\n prominent prices, fast paths to cart, no recommendations.\n Signals: high clicks/min, low dwell, high scroll depth, few hovers.\n- \"deliberate\": user is researching; help them compare. Larger cards,\n reviews surfaced inline, \"people also viewed\", expandable detail.\n Signals: low clicks/min, high dwell, hovers across multiple products.\n- \"neutral\": insufficient signal yet, or pattern is mixed. Baseline grid.\n Default for first ~10 events.\n\nExamples:\nInput: {\"clicks_per_min\":14,\"avg_dwell_ms\":820,\"scroll_depth\":0.91,\"hover_count\":2,\"events_seen\":18}\nOutput: {\"variant\":\"decisive\",\"confidence\":0.86,\"reasoning\":\"Fast clicks, low dwell, deep scroll — purposeful navigation.\"}\n\nInput: {\"clicks_per_min\":3,\"avg_dwell_ms\":7400,\"scroll_depth\":0.42,\"hover_count\":4,\"events_seen\":22}\nOutput: {\"variant\":\"deliberate\",\"confidence\":0.81,\"reasoning\":\"Slow pace, long dwell, multi-product hover — comparing options.\"}\n\nInput: {\"clicks_per_min\":5,\"avg_dwell_ms\":2100,\"scroll_depth\":0.55,\"hover_count\":2,\"events_seen\":7}\nOutput: {\"variant\":\"neutral\",\"confidence\":0.6,\"reasoning\":\"Not enough events yet to commit to a mode.\"}\n\nReturn ONLY a JSON object. No prose, no markdown.\n`.trim();\n\nconst VALID_VARIANTS: ReadonlySet<Variant> = new Set([\"decisive\", \"deliberate\", \"neutral\"]);\n\nconst FALLBACK: AgentDirective = {\n variant: \"neutral\",\n confidence: 0,\n reasoning: \"Classifier error.\",\n};\n\nexport type CreateGeminiClassifierOpts = {\n apiKey: string;\n model?: string;\n endpoint?: string;\n fetchImpl?: typeof fetch;\n};\n\nexport function createGeminiClassifier(opts: CreateGeminiClassifierOpts): ClassifyFn {\n const { apiKey, model = \"gemini-2.0-flash\", endpoint, fetchImpl } = opts;\n const url =\n endpoint ??\n `https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(model)}:generateContent`;\n const fetcher = fetchImpl ?? (typeof fetch !== \"undefined\" ? fetch.bind(globalThis) : null);\n\n return async (summary) => {\n if (!fetcher) return FALLBACK;\n try {\n const res = await fetcher(`${url}?key=${encodeURIComponent(apiKey)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n systemInstruction: { parts: [{ text: CLASSIFIER_SYSTEM_PROMPT }] },\n contents: [\n {\n role: \"user\",\n parts: [{ text: JSON.stringify(summary) }],\n },\n ],\n generationConfig: {\n responseMimeType: \"application/json\",\n temperature: 0.2,\n },\n }),\n });\n\n if (!res.ok) return FALLBACK;\n const data = (await res.json()) as {\n candidates?: { content?: { parts?: { text?: string }[] } }[];\n };\n const text = data.candidates?.[0]?.content?.parts?.[0]?.text;\n if (!text) return FALLBACK;\n\n const parsed = JSON.parse(text) as Partial<AgentDirective>;\n if (\n !parsed ||\n typeof parsed !== \"object\" ||\n typeof parsed.variant !== \"string\" ||\n !VALID_VARIANTS.has(parsed.variant as Variant) ||\n typeof parsed.reasoning !== \"string\"\n ) {\n return FALLBACK;\n }\n const confidence =\n typeof parsed.confidence === \"number\" && Number.isFinite(parsed.confidence)\n ? Math.max(0, Math.min(1, parsed.confidence))\n : 0.5;\n\n return {\n variant: parsed.variant as Variant,\n confidence,\n reasoning: parsed.reasoning,\n };\n } catch {\n return FALLBACK;\n }\n };\n}\n","import type { ClassifyFn } from \"../types\";\n\nexport function createHeuristicClassifier(): ClassifyFn {\n return async (summary) => {\n if (summary.events_seen < 10) {\n return {\n variant: \"neutral\",\n confidence: 0.5,\n reasoning: \"Insufficient events.\",\n };\n }\n if (summary.clicks_per_min > 8 && summary.avg_dwell_ms < 2000) {\n return {\n variant: \"decisive\",\n confidence: 0.8,\n reasoning: \"Fast pace, low dwell.\",\n };\n }\n if (summary.avg_dwell_ms > 4000 && summary.hover_count > 2) {\n return {\n variant: \"deliberate\",\n confidence: 0.8,\n reasoning: \"Slow pace, multi-hover.\",\n };\n }\n return {\n variant: \"neutral\",\n confidence: 0.6,\n reasoning: \"Mixed signals.\",\n };\n };\n}\n"],"mappings":"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","names":["React","useState","jsx","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/BeGenProvider.tsx","../src/useBehaviorTracker.ts","../src/AdaptationEngine.ts","../src/domSnapshot.ts","../src/adapters/http.ts"],"sourcesContent":["import * as React from \"react\";\nimport type {\n Adaptation,\n AdaptationPlan,\n AdaptInput,\n BeGenContextValue,\n BehaviorEvent,\n BehaviorListener,\n BehaviorSummary,\n ClassifyFn,\n DesignSystem,\n ScopeOpts,\n} from \"./types\";\nimport { useBehaviorTracker } from \"./useBehaviorTracker\";\nimport { AdaptationEngine } from \"./AdaptationEngine\";\nimport { snapshotVisibleSelectors } from \"./domSnapshot\";\n\nexport type BeGenProviderProps<TContext = { route: string }> = {\n /** The agent's vocabulary — what CSS variables and classes it may emit. */\n designSystem: DesignSystem;\n /** Per-page state forwarded into every BehaviorSummary. */\n pageContext: TContext;\n /**\n * Single-pass agent. Receives behavior + DOM + design system, returns a plan.\n * If omitted, the provider does NOT call any agent — it only tracks behavior\n * and exposes summaries via context. (Pair with createCopilotKitAdapter or\n * createHttpAdapter for real adaptation.)\n */\n classify?: ClassifyFn<TContext>;\n /** Restrict where the agent's adaptations may target. */\n scope?: ScopeOpts;\n /** Minimum ms between agent calls. Default 5000. */\n rateLimitMs?: number;\n /** Don't trigger an agent call until at least this many events have flushed since the last call. Default 5. */\n triggerEveryEvents?: number;\n /** Tracker idle-flush window. */\n flushAfterMs?: number;\n /** Tracker count-flush. */\n flushEveryEvents?: number;\n /** Tracker ring-buffer cap. */\n bufferSize?: number;\n /** Plug-in event sources. */\n customListeners?: BehaviorListener[];\n /** Element to scope listeners to. Default: document.body. */\n containerRef?: React.RefObject<HTMLElement | null>;\n /** Pre-canned events injected on mount (for demos). */\n seedTrace?: BehaviorEvent[];\n children: React.ReactNode;\n};\n\nconst BeGenContext = React.createContext<BeGenContextValue<any> | null>(null);\n\nexport function useBeGenContext<TContext = { route: string }>(): BeGenContextValue<TContext> {\n const ctx = React.useContext(BeGenContext);\n if (!ctx) {\n throw new Error(\"useBeGenContext must be used inside <BeGenProvider>\");\n }\n return ctx as BeGenContextValue<TContext>;\n}\n\nexport function BeGenProvider<TContext = { route: string }>(\n props: BeGenProviderProps<TContext>,\n): React.ReactElement {\n const {\n designSystem,\n pageContext,\n classify,\n scope,\n rateLimitMs = 5000,\n triggerEveryEvents = 5,\n flushAfterMs = 5000,\n flushEveryEvents = 10,\n bufferSize = 50,\n customListeners,\n containerRef,\n seedTrace,\n children,\n } = props;\n\n // Engine is created lazily once document.body exists (post-mount).\n const engineRef = React.useRef<AdaptationEngine | null>(null);\n\n const [summary, setSummary] = React.useState<BehaviorSummary<TContext> | null>(null);\n const [lastPlan, setLastPlan] = React.useState<AdaptationPlan | null>(null);\n const [appliedAdaptations, setAppliedAdaptations] = React.useState<\n ReadonlyArray<Adaptation>\n >([]);\n\n const lastClassifyAtRef = React.useRef(0);\n const inFlightRef = React.useRef(false);\n const eventsSinceClassifyRef = React.useRef(0);\n const lastPlanHashRef = React.useRef<string | null>(null);\n\n const classifyRef = React.useRef(classify);\n React.useEffect(() => {\n classifyRef.current = classify;\n }, [classify]);\n\n const designSystemRef = React.useRef(designSystem);\n React.useEffect(() => {\n designSystemRef.current = designSystem;\n }, [designSystem]);\n\n const pageContextRef = React.useRef(pageContext);\n React.useEffect(() => {\n pageContextRef.current = pageContext;\n }, [pageContext]);\n\n const scopeRef = React.useRef(scope);\n React.useEffect(() => {\n scopeRef.current = scope;\n }, [scope]);\n\n // Mount the engine once we're in the browser.\n React.useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = containerRef?.current ?? document.body;\n if (!root) return;\n engineRef.current = new AdaptationEngine({\n root,\n scope: scopeRef.current,\n onEvent: () => {\n if (engineRef.current) {\n setAppliedAdaptations(engineRef.current.getApplied().slice());\n }\n },\n });\n return () => {\n engineRef.current?.revertAll();\n engineRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleFlush = React.useCallback(\n async (s: BehaviorSummary<TContext>) => {\n setSummary(s);\n eventsSinceClassifyRef.current += 1;\n\n const fn = classifyRef.current;\n if (!fn) return;\n if (inFlightRef.current) return;\n const now = Date.now();\n if (now - lastClassifyAtRef.current < rateLimitMs) return;\n if (eventsSinceClassifyRef.current < triggerEveryEvents) return;\n\n lastClassifyAtRef.current = now;\n eventsSinceClassifyRef.current = 0;\n inFlightRef.current = true;\n\n try {\n const root =\n (containerRef?.current ?? (typeof document !== \"undefined\" ? document.body : null)) ??\n null;\n const visibleSelectors = root\n ? snapshotVisibleSelectors(root, { scope: scopeRef.current })\n : [];\n\n const route =\n (s.page_context as unknown as { route?: string })?.route ?? \"/\";\n\n const input: AdaptInput<TContext> = {\n summary: s,\n designSystem: designSystemRef.current,\n dom: { visibleSelectors, route },\n };\n\n const plan = await fn(input);\n if (!plan || !Array.isArray(plan.adaptations)) return;\n\n // Skip identical consecutive plans.\n const hash = hashPlan(plan);\n if (hash === lastPlanHashRef.current) return;\n lastPlanHashRef.current = hash;\n\n setLastPlan(plan);\n engineRef.current?.apply(plan);\n } catch {\n // Classifier failure: keep current state.\n } finally {\n inFlightRef.current = false;\n }\n },\n [rateLimitMs, triggerEveryEvents, containerRef],\n );\n\n useBehaviorTracker<TContext>({\n containerRef,\n onFlush: handleFlush,\n pageContext,\n seedTrace,\n customListeners,\n flushAfterMs,\n flushEveryEvents,\n bufferSize,\n });\n\n const recentEventsRef = React.useRef<ReadonlyArray<BehaviorEvent>>([]);\n // We don't expose recentEvents directly from tracker into context here to\n // avoid extra renders; consumers needing a live event stream can use\n // useBehaviorTracker directly.\n\n const applyPlan = React.useCallback((plan: AdaptationPlan) => {\n if (!plan || !Array.isArray(plan.adaptations)) return;\n const hash = hashPlan(plan);\n if (hash === lastPlanHashRef.current) return;\n lastPlanHashRef.current = hash;\n setLastPlan(plan);\n engineRef.current?.apply(plan);\n }, []);\n\n const getDesignSystem = React.useCallback(\n () => designSystemRef.current,\n [],\n );\n\n const value = React.useMemo<BeGenContextValue<TContext>>(\n () => ({\n summary,\n lastPlan,\n appliedAdaptations,\n recentEvents: recentEventsRef.current,\n applyPlan,\n getDesignSystem,\n }),\n [summary, lastPlan, appliedAdaptations, applyPlan, getDesignSystem],\n );\n\n return (\n <BeGenContext.Provider value={value as BeGenContextValue<any>}>\n {children}\n </BeGenContext.Provider>\n );\n}\n\nfunction hashPlan(plan: AdaptationPlan): string {\n // Cheap deterministic hash for skip-if-identical comparison.\n // Order-sensitive: agent emitting adaptations in different orders is treated as different intent.\n const parts = plan.adaptations.map((a) => {\n switch (a.kind) {\n case \"set-css-var\":\n return `v|${a.selector}|${a.name}|${a.value}`;\n case \"add-class\":\n return `+|${a.selector}|${a.className}`;\n case \"remove-class\":\n return `-|${a.selector}|${a.className}`;\n case \"set-style\":\n return `s|${a.selector}|${a.property}|${a.value}`;\n case \"set-attribute\":\n return `a|${a.selector}|${a.name}|${a.value}`;\n case \"set-aria-label\":\n return `l|${a.selector}|${a.value}`;\n }\n });\n return parts.join(\"\\n\");\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type {\n BehaviorEvent,\n BehaviorListener,\n BehaviorSummary,\n} from \"./types\";\n\nexport type UseBehaviorTrackerOpts<TContext = { route: string }> = {\n /** DOM element to scope listeners to. Defaults to document.body. */\n containerRef?: React.RefObject<HTMLElement | null>;\n /** Flush after this many events. Default 10. */\n flushEveryEvents?: number;\n /** Flush after this many ms of idle. Default 5000. */\n flushAfterMs?: number;\n /** Ring buffer cap. Default 50. */\n bufferSize?: number;\n /** Called on every flush with the computed summary. */\n onFlush: (summary: BehaviorSummary<TContext>) => void;\n /** Page context (route, etc.) — included in every summary. */\n pageContext: TContext;\n /** Optional pre-canned events injected on mount. */\n seedTrace?: BehaviorEvent[];\n /** Plug-in event sources beyond the built-ins. */\n customListeners?: BehaviorListener[];\n};\n\nconst RECENT_EVENTS_CAP = 10;\nconst HOVER_MIN_MS = 200;\nconst RAGE_CLICK_WINDOW_MS = 1000;\nconst RAGE_CLICK_THRESHOLD = 3;\nconst INPUT_THROTTLE_MS = 1000;\n\nfunction targetLabel(el: EventTarget | null): string {\n if (!(el instanceof HTMLElement)) return \"unknown\";\n const begenId = el.getAttribute(\"data-begen-id\");\n if (begenId) return `[data-begen-id=\"${begenId}\"]`;\n if (el.id) return `#${el.id}`;\n const testId = el.getAttribute(\"data-testid\");\n if (testId) return `[data-testid=\"${testId}\"]`;\n return el.tagName.toLowerCase();\n}\n\nfunction computeSummary<TContext>(\n buffer: BehaviorEvent[],\n bufferSize: number,\n pageContext: TContext,\n custom: Record<string, number | string | boolean>,\n): BehaviorSummary<TContext> {\n const now = Date.now();\n const windowStart = now - 60_000;\n\n let clicksLastMin = 0;\n let rageClicks = 0;\n let dwellSum = 0;\n let dwellCount = 0;\n let maxScroll = 0;\n let formInteractions = 0;\n let errorsSeen = 0;\n const hoverTargets = new Set<string>();\n let viewportW =\n typeof window !== \"undefined\" ? window.innerWidth || 0 : 0;\n let viewportH =\n typeof window !== \"undefined\" ? window.innerHeight || 0 : 0;\n\n for (const ev of buffer) {\n switch (ev.kind) {\n case \"click\":\n if (ev.t >= windowStart) clicksLastMin += 1;\n break;\n case \"rage-click\":\n rageClicks += 1;\n break;\n case \"dwell\":\n dwellSum += ev.durationMs;\n dwellCount += 1;\n break;\n case \"scroll\":\n if (ev.depth > maxScroll) maxScroll = ev.depth;\n break;\n case \"hover\":\n hoverTargets.add(ev.target);\n break;\n case \"input\":\n case \"submit\":\n formInteractions += 1;\n break;\n case \"error\":\n errorsSeen += 1;\n break;\n case \"viewport-change\":\n viewportW = ev.width;\n viewportH = ev.height;\n break;\n default:\n break;\n }\n }\n\n return {\n clicks_per_min: clicksLastMin,\n rage_clicks: rageClicks,\n avg_dwell_ms: dwellCount === 0 ? 0 : Math.round(dwellSum / dwellCount),\n scroll_depth: Math.max(0, Math.min(1, maxScroll)),\n hover_count: hoverTargets.size,\n form_interactions: formInteractions,\n errors_seen: errorsSeen,\n events_seen: Math.min(buffer.length, bufferSize),\n viewport: { width: viewportW, height: viewportH },\n custom,\n page_context: pageContext,\n };\n}\n\nexport function useBehaviorTracker<TContext = { route: string }>(\n opts: UseBehaviorTrackerOpts<TContext>,\n): { recentEvents: BehaviorEvent[] } {\n const {\n containerRef,\n flushEveryEvents = 10,\n flushAfterMs = 5000,\n bufferSize = 50,\n onFlush,\n pageContext,\n seedTrace,\n customListeners,\n } = opts;\n\n const bufferRef = useRef<BehaviorEvent[]>([]);\n const sinceFlushRef = useRef(0);\n const lastFlushAtRef = useRef(Date.now());\n const hoverStartRef = useRef<Map<string, number>>(new Map());\n const focusStartRef = useRef<Map<string, number>>(new Map());\n const lastInputAtRef = useRef<Map<string, number>>(new Map());\n const recentClicksRef = useRef<Map<string, number[]>>(new Map());\n const scrollRafRef = useRef<number | null>(null);\n const resizeRafRef = useRef<number | null>(null);\n const customSlotRef = useRef<Record<string, number | string | boolean>>({});\n\n const onFlushRef = useRef(onFlush);\n const pageContextRef = useRef(pageContext);\n useEffect(() => {\n onFlushRef.current = onFlush;\n }, [onFlush]);\n useEffect(() => {\n pageContextRef.current = pageContext;\n }, [pageContext]);\n\n const [recentEvents, setRecentEvents] = useState<BehaviorEvent[]>([]);\n\n const pushEvent = (ev: BehaviorEvent) => {\n const buf = bufferRef.current;\n buf.push(ev);\n if (buf.length > bufferSize) buf.splice(0, buf.length - bufferSize);\n sinceFlushRef.current += 1;\n\n setRecentEvents((prev) => {\n const next = [...prev, ev];\n if (next.length > RECENT_EVENTS_CAP) {\n next.splice(0, next.length - RECENT_EVENTS_CAP);\n }\n return next;\n });\n\n if (sinceFlushRef.current >= flushEveryEvents) {\n flush();\n }\n };\n\n const flush = () => {\n const summary = computeSummary(\n bufferRef.current,\n bufferSize,\n pageContextRef.current,\n customSlotRef.current,\n );\n sinceFlushRef.current = 0;\n lastFlushAtRef.current = Date.now();\n onFlushRef.current(summary);\n };\n\n // Seed trace handler (mount-only, rebases t to \"now\")\n useEffect(() => {\n if (!seedTrace || seedTrace.length === 0) return;\n const buf = bufferRef.current;\n const maxT = seedTrace.reduce((m, e) => (e.t > m ? e.t : m), -Infinity);\n const now = Date.now();\n const offset = Number.isFinite(maxT) ? now - maxT : 0;\n const rebased = seedTrace.map((e) => ({ ...e, t: e.t + offset }));\n buf.push(...rebased);\n if (buf.length > bufferSize) buf.splice(0, buf.length - bufferSize);\n const summary = computeSummary(\n buf,\n bufferSize,\n pageContextRef.current,\n customSlotRef.current,\n );\n sinceFlushRef.current = 0;\n lastFlushAtRef.current = Date.now();\n onFlushRef.current(summary);\n // mount-only seed\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Main listener wiring\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n const el =\n containerRef?.current ??\n (typeof document !== \"undefined\" ? document.body : null);\n if (!el) return;\n\n const onClick = (e: MouseEvent) => {\n const label = targetLabel(e.target);\n const t = Date.now();\n pushEvent({ kind: \"click\", target: label, t });\n\n // Rage-click detection\n const recent = recentClicksRef.current.get(label) ?? [];\n const filtered = recent.filter(\n (then) => t - then < RAGE_CLICK_WINDOW_MS,\n );\n filtered.push(t);\n recentClicksRef.current.set(label, filtered);\n if (filtered.length >= RAGE_CLICK_THRESHOLD) {\n pushEvent({\n kind: \"rage-click\",\n target: label,\n count: filtered.length,\n t,\n });\n recentClicksRef.current.set(label, []);\n }\n };\n\n const onMouseOver = (e: MouseEvent) => {\n const label = targetLabel(e.target);\n if (!hoverStartRef.current.has(label)) {\n hoverStartRef.current.set(label, Date.now());\n }\n };\n\n const onMouseOut = (e: MouseEvent) => {\n const label = targetLabel(e.target);\n const started = hoverStartRef.current.get(label);\n if (started == null) return;\n hoverStartRef.current.delete(label);\n const durationMs = Date.now() - started;\n if (durationMs < HOVER_MIN_MS) return;\n const t = Date.now();\n pushEvent({ kind: \"hover\", target: label, durationMs, t });\n pushEvent({ kind: \"dwell\", target: label, durationMs, t });\n };\n\n const onFocusIn = (e: FocusEvent) => {\n const label = targetLabel(e.target);\n focusStartRef.current.set(label, Date.now());\n pushEvent({ kind: \"focus\", target: label, t: Date.now() });\n };\n\n const onFocusOut = (e: FocusEvent) => {\n const label = targetLabel(e.target);\n const started = focusStartRef.current.get(label);\n if (started == null) return;\n focusStartRef.current.delete(label);\n const durationMs = Date.now() - started;\n if (durationMs < HOVER_MIN_MS) return;\n pushEvent({\n kind: \"blur\",\n target: label,\n durationMs,\n t: Date.now(),\n });\n };\n\n const onInput = (e: Event) => {\n const target = e.target;\n if (\n !(\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n (target instanceof HTMLElement &&\n (target as HTMLElement).isContentEditable)\n )\n ) {\n return;\n }\n const label = targetLabel(target);\n const now = Date.now();\n const last = lastInputAtRef.current.get(label) ?? 0;\n if (now - last < INPUT_THROTTLE_MS) return;\n lastInputAtRef.current.set(label, now);\n pushEvent({ kind: \"input\", target: label, t: now });\n };\n\n const onSubmit = (e: Event) => {\n const label = targetLabel(e.target);\n pushEvent({ kind: \"submit\", target: label, t: Date.now() });\n };\n\n const computeScrollDepth = () => {\n const rect = el.getBoundingClientRect();\n const viewportHCalc = window.innerHeight || 1;\n const elementH = el.scrollHeight || rect.height || 1;\n const visibleBottom = Math.min(rect.bottom, viewportHCalc);\n const scrolledPast = Math.max(0, visibleBottom - rect.top);\n return Math.max(0, Math.min(1, scrolledPast / elementH));\n };\n\n const onScroll = () => {\n if (scrollRafRef.current != null) return;\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null;\n pushEvent({\n kind: \"scroll\",\n depth: computeScrollDepth(),\n t: Date.now(),\n });\n });\n };\n\n const onResize = () => {\n if (resizeRafRef.current != null) return;\n resizeRafRef.current = requestAnimationFrame(() => {\n resizeRafRef.current = null;\n pushEvent({\n kind: \"viewport-change\",\n width: window.innerWidth,\n height: window.innerHeight,\n t: Date.now(),\n });\n });\n };\n\n const onError = (e: ErrorEvent) => {\n pushEvent({\n kind: \"error\",\n message: String(e.message ?? \"unknown\"),\n t: Date.now(),\n });\n };\n\n const onUnhandledRejection = (e: PromiseRejectionEvent) => {\n pushEvent({\n kind: \"error\",\n message: `unhandled-rejection: ${String(e.reason ?? \"unknown\")}`,\n t: Date.now(),\n });\n };\n\n el.addEventListener(\"click\", onClick);\n el.addEventListener(\"mouseover\", onMouseOver);\n el.addEventListener(\"mouseout\", onMouseOut);\n el.addEventListener(\"focusin\", onFocusIn);\n el.addEventListener(\"focusout\", onFocusOut);\n el.addEventListener(\"input\", onInput);\n el.addEventListener(\"submit\", onSubmit);\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n window.addEventListener(\"resize\", onResize);\n window.addEventListener(\"error\", onError);\n window.addEventListener(\"unhandledrejection\", onUnhandledRejection);\n\n // Custom listeners (plug-in)\n const cleanups: Array<() => void> = [];\n if (customListeners) {\n for (const listener of customListeners) {\n try {\n const cleanup = listener.attach(el, pushEvent);\n cleanups.push(cleanup);\n } catch {\n // Listener attach failure is non-fatal.\n }\n }\n }\n\n const interval = window.setInterval(() => {\n if (Date.now() - lastFlushAtRef.current >= flushAfterMs) {\n flush();\n }\n }, Math.max(250, Math.floor(flushAfterMs / 4)));\n\n return () => {\n el.removeEventListener(\"click\", onClick);\n el.removeEventListener(\"mouseover\", onMouseOver);\n el.removeEventListener(\"mouseout\", onMouseOut);\n el.removeEventListener(\"focusin\", onFocusIn);\n el.removeEventListener(\"focusout\", onFocusOut);\n el.removeEventListener(\"input\", onInput);\n el.removeEventListener(\"submit\", onSubmit);\n window.removeEventListener(\"scroll\", onScroll);\n window.removeEventListener(\"resize\", onResize);\n window.removeEventListener(\"error\", onError);\n window.removeEventListener(\"unhandledrejection\", onUnhandledRejection);\n window.clearInterval(interval);\n if (scrollRafRef.current != null) {\n cancelAnimationFrame(scrollRafRef.current);\n }\n if (resizeRafRef.current != null) {\n cancelAnimationFrame(resizeRafRef.current);\n }\n for (const cleanup of cleanups) {\n try {\n cleanup();\n } catch {\n // Tolerate cleanup errors.\n }\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef, flushAfterMs, flushEveryEvents, bufferSize]);\n\n return { recentEvents };\n}\n","import type { Adaptation, AdaptationPlan, ScopeOpts } from \"./types\";\n\n// CSS properties whose values can structurally break a layout — agents\n// must not touch these via set-style. Variables (custom properties) and\n// classes are the safe channels for layout-affecting design tokens.\nconst STRUCTURAL_PROPERTY_DENY = new Set([\n \"display\",\n \"position\",\n \"visibility\",\n \"float\",\n \"clear\",\n \"z-index\",\n \"overflow\",\n \"overflow-x\",\n \"overflow-y\",\n \"transform-origin\",\n]);\n\ntype RevertFn = () => void;\n\nexport type AdaptationEngineEvent =\n | { kind: \"applied\"; adaptation: Adaptation; matched: number }\n | { kind: \"skipped\"; adaptation: Adaptation; reason: string }\n | { kind: \"reverted\"; count: number };\n\nexport type AdaptationEngineOpts = {\n root: HTMLElement;\n scope?: ScopeOpts;\n onEvent?: (e: AdaptationEngineEvent) => void;\n};\n\nexport class AdaptationEngine {\n private root: HTMLElement;\n private scope: ScopeOpts;\n private onEvent?: (e: AdaptationEngineEvent) => void;\n private revertLog: RevertFn[] = [];\n private appliedSnapshot: Adaptation[] = [];\n\n constructor(opts: AdaptationEngineOpts) {\n this.root = opts.root;\n this.scope = opts.scope ?? {};\n this.onEvent = opts.onEvent;\n }\n\n /** Apply a plan. Reverts the previous plan first so mutations don't accumulate. */\n apply(plan: AdaptationPlan): void {\n this.revertAll();\n for (const adaptation of plan.adaptations) {\n this.applyOne(adaptation);\n }\n }\n\n /** Roll back every adaptation applied since the last revertAll. */\n revertAll(): void {\n if (this.revertLog.length === 0) return;\n const count = this.revertLog.length;\n // Revert in reverse order so dependent mutations unwind cleanly.\n for (let i = this.revertLog.length - 1; i >= 0; i--) {\n try {\n this.revertLog[i]();\n } catch {\n // Tolerate revert failures (e.g. element detached). Continue.\n }\n }\n this.revertLog = [];\n this.appliedSnapshot = [];\n this.onEvent?.({ kind: \"reverted\", count });\n }\n\n /** Read-only view of currently applied adaptations (for telemetry). */\n getApplied(): ReadonlyArray<Adaptation> {\n return this.appliedSnapshot;\n }\n\n // ── Internals ──────────────────────────────────────────────────────\n\n private applyOne(adaptation: Adaptation): void {\n const elements = this.resolveTargets(adaptation);\n if (elements === null) return; // skipped (logged)\n if (elements.length === 0) {\n this.onEvent?.({ kind: \"skipped\", adaptation, reason: \"no-match\" });\n return;\n }\n\n // Property-level safety: structural CSS properties via set-style are denied.\n if (\n adaptation.kind === \"set-style\" &&\n STRUCTURAL_PROPERTY_DENY.has(adaptation.property.toLowerCase())\n ) {\n this.onEvent?.({\n kind: \"skipped\",\n adaptation,\n reason: `structural-property-denied:${adaptation.property}`,\n });\n return;\n }\n\n for (const el of elements) {\n const revert = this.applyToElement(el, adaptation);\n if (revert) this.revertLog.push(revert);\n }\n this.appliedSnapshot.push(adaptation);\n this.onEvent?.({\n kind: \"applied\",\n adaptation,\n matched: elements.length,\n });\n }\n\n private resolveTargets(adaptation: Adaptation): HTMLElement[] | null {\n const sel = adaptation.selector;\n if (!sel || typeof sel !== \"string\") {\n this.onEvent?.({\n kind: \"skipped\",\n adaptation,\n reason: \"invalid-selector\",\n });\n return null;\n }\n\n if (this.scope.deny?.some((d) => this.selectorMatchesPattern(sel, d))) {\n this.onEvent?.({ kind: \"skipped\", adaptation, reason: \"scope-deny\" });\n return null;\n }\n if (\n this.scope.allow &&\n !this.scope.allow.some((a) => this.selectorMatchesPattern(sel, a))\n ) {\n this.onEvent?.({\n kind: \"skipped\",\n adaptation,\n reason: \"scope-not-in-allow\",\n });\n return null;\n }\n\n let nodes: NodeListOf<Element>;\n try {\n // `:root` and `html` should resolve to documentElement, which lives above this.root.\n // Allow them as a special case so design tokens land where Tailwind reads them.\n if (sel === \":root\" || sel === \"html\") {\n return [document.documentElement];\n }\n nodes = this.root.querySelectorAll(sel);\n } catch {\n this.onEvent?.({\n kind: \"skipped\",\n adaptation,\n reason: \"selector-syntax-error\",\n });\n return null;\n }\n return Array.from(nodes).filter(\n (n): n is HTMLElement => n instanceof HTMLElement,\n );\n }\n\n private selectorMatchesPattern(selector: string, pattern: string): boolean {\n // Cheap conservative check: an exact match or pattern is a substring.\n // For real apps the scope.allow/deny lists should be specific.\n if (selector === pattern) return true;\n return selector.includes(pattern);\n }\n\n private applyToElement(\n el: HTMLElement,\n adaptation: Adaptation,\n ): RevertFn | null {\n switch (adaptation.kind) {\n case \"set-css-var\": {\n const prev = el.style.getPropertyValue(adaptation.name);\n const prevPriority = el.style.getPropertyPriority(adaptation.name);\n el.style.setProperty(adaptation.name, adaptation.value);\n return () => {\n if (prev) el.style.setProperty(adaptation.name, prev, prevPriority);\n else el.style.removeProperty(adaptation.name);\n };\n }\n case \"add-class\": {\n if (el.classList.contains(adaptation.className)) return null;\n el.classList.add(adaptation.className);\n return () => el.classList.remove(adaptation.className);\n }\n case \"remove-class\": {\n if (!el.classList.contains(adaptation.className)) return null;\n el.classList.remove(adaptation.className);\n return () => el.classList.add(adaptation.className);\n }\n case \"set-style\": {\n const prop = adaptation.property;\n const prev = el.style.getPropertyValue(prop);\n const prevPriority = el.style.getPropertyPriority(prop);\n el.style.setProperty(prop, adaptation.value);\n return () => {\n if (prev) el.style.setProperty(prop, prev, prevPriority);\n else el.style.removeProperty(prop);\n };\n }\n case \"set-attribute\": {\n const had = el.hasAttribute(adaptation.name);\n const prev = el.getAttribute(adaptation.name);\n el.setAttribute(adaptation.name, adaptation.value);\n return () => {\n if (had && prev !== null) el.setAttribute(adaptation.name, prev);\n else el.removeAttribute(adaptation.name);\n };\n }\n case \"set-aria-label\": {\n const had = el.hasAttribute(\"aria-label\");\n const prev = el.getAttribute(\"aria-label\");\n el.setAttribute(\"aria-label\", adaptation.value);\n return () => {\n if (had && prev !== null) el.setAttribute(\"aria-label\", prev);\n else el.removeAttribute(\"aria-label\");\n };\n }\n default: {\n // Exhaustiveness check\n const _exhaustive: never = adaptation;\n void _exhaustive;\n return null;\n }\n }\n }\n}\n","import type { ScopeOpts } from \"./types\";\n\nexport type DomSnapshotOpts = {\n /** Maximum number of selectors to return (default 50). */\n maxSelectors?: number;\n /** Scope filter — only include elements whose selectors match allow / not deny. */\n scope?: ScopeOpts;\n};\n\n/**\n * Walk the visible DOM under `root` and return a deduplicated list of\n * stable CSS selectors the agent can use. Prefers semantic anchors\n * (id, data-* attributes, role, semantic tag names) over class soup.\n */\nexport function snapshotVisibleSelectors(\n root: HTMLElement,\n opts: DomSnapshotOpts = {},\n): string[] {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return [];\n }\n\n const max = opts.maxSelectors ?? 50;\n const seen = new Set<string>();\n const out: string[] = [];\n\n const viewportH = window.innerHeight || 1;\n const viewportW = window.innerWidth || 1;\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node) => {\n if (!(node instanceof HTMLElement)) return NodeFilter.FILTER_SKIP;\n // Skip clearly invisible nodes.\n const rect = node.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return NodeFilter.FILTER_SKIP;\n if (rect.bottom < 0 || rect.top > viewportH) return NodeFilter.FILTER_SKIP;\n if (rect.right < 0 || rect.left > viewportW) return NodeFilter.FILTER_SKIP;\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n\n let node = walker.nextNode();\n while (node && out.length < max) {\n if (node instanceof HTMLElement) {\n const sel = pickSelector(node);\n if (sel && !seen.has(sel) && passesScope(sel, opts.scope)) {\n seen.add(sel);\n out.push(sel);\n }\n }\n node = walker.nextNode();\n }\n return out;\n}\n\nfunction pickSelector(el: HTMLElement): string | null {\n // 1. id (best — globally unique)\n if (el.id) return `#${cssEscape(el.id)}`;\n\n // 2. data-begen-id (library-recommended stable handle)\n const begenId = el.getAttribute(\"data-begen-id\");\n if (begenId) return `[data-begen-id=\"${attrEscape(begenId)}\"]`;\n\n // 3. data-testid (common stable handle in apps with tests)\n const testId = el.getAttribute(\"data-testid\");\n if (testId) return `[data-testid=\"${attrEscape(testId)}\"]`;\n\n // 4. role attribute\n const role = el.getAttribute(\"role\");\n if (role) return `${el.tagName.toLowerCase()}[role=\"${attrEscape(role)}\"]`;\n\n // 5. semantic tag (header, main, nav, footer, aside, section with aria-label, etc.)\n const semantic = SEMANTIC_TAGS.has(el.tagName.toLowerCase());\n if (semantic) {\n const aria = el.getAttribute(\"aria-label\");\n if (aria) {\n return `${el.tagName.toLowerCase()}[aria-label=\"${attrEscape(aria)}\"]`;\n }\n return el.tagName.toLowerCase();\n }\n\n // 6. fall back to a single representative class if any\n const cls = pickStableClass(el);\n if (cls) return `.${cssEscape(cls)}`;\n\n return null;\n}\n\nconst SEMANTIC_TAGS = new Set([\n \"header\",\n \"main\",\n \"nav\",\n \"footer\",\n \"aside\",\n \"article\",\n \"section\",\n \"form\",\n \"dialog\",\n]);\n\nfunction pickStableClass(el: HTMLElement): string | null {\n // Skip Tailwind utility-shaped classes (contain \":\" or start with hash-derived hex).\n for (const cls of el.classList) {\n if (cls.includes(\":\")) continue; // Tailwind variants like md:flex\n if (/^[a-z]+-[a-z0-9-]+$/.test(cls)) continue; // Tailwind atoms like text-red-500\n if (cls.length < 3) continue;\n return cls;\n }\n return null;\n}\n\nfunction passesScope(selector: string, scope?: ScopeOpts): boolean {\n if (!scope) return true;\n if (scope.deny?.some((d) => selector === d || selector.includes(d))) {\n return false;\n }\n if (\n scope.allow &&\n !scope.allow.some((a) => selector === a || selector.includes(a))\n ) {\n return false;\n }\n return true;\n}\n\nfunction cssEscape(s: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(s);\n }\n return s.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n\nfunction attrEscape(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n","import type { AdaptInput, AdaptationPlan, ClassifyFn } from \"../types\";\n\nexport type HttpAdapterOpts = {\n /** Endpoint that accepts POST {AdaptInput} and returns AdaptationPlan. */\n url: string;\n /** Extra headers (auth, etc.). */\n headers?: Record<string, string>;\n /** Optional fetch override (testing / SSR / proxy). */\n fetchImpl?: typeof fetch;\n /** Abort the request after this many ms. Default 8000. */\n timeoutMs?: number;\n /** Custom request body shaper if your endpoint expects a different envelope. */\n bodyTransform?: (input: AdaptInput) => unknown;\n /** Custom response shaper if your endpoint returns a different envelope. */\n responseTransform?: (raw: unknown) => AdaptationPlan;\n};\n\nconst FALLBACK_PLAN: AdaptationPlan = {\n adaptations: [],\n confidence: 0,\n reasoning: \"HTTP adapter error.\",\n};\n\n/**\n * Generic transport. Posts {summary, designSystem, dom} to the given URL and\n * expects an AdaptationPlan back. Use this when you have a custom API route\n * (Next.js, Hono, Express, anything) that calls your LLM server-side and\n * shapes the result into the contract.\n */\nexport function createHttpAdapter(opts: HttpAdapterOpts): ClassifyFn {\n const {\n url,\n headers,\n fetchImpl,\n timeoutMs = 8000,\n bodyTransform,\n responseTransform,\n } = opts;\n const fetcher =\n fetchImpl ?? (typeof fetch !== \"undefined\" ? fetch.bind(globalThis) : null);\n\n return async (input) => {\n if (!fetcher) return FALLBACK_PLAN;\n\n const ac = new AbortController();\n const timer = setTimeout(() => ac.abort(), timeoutMs);\n\n try {\n const body = bodyTransform ? bodyTransform(input) : input;\n const res = await fetcher(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...headers },\n body: JSON.stringify(body),\n signal: ac.signal,\n });\n if (!res.ok) return FALLBACK_PLAN;\n const raw = (await res.json()) as unknown;\n const plan = responseTransform ? responseTransform(raw) : (raw as AdaptationPlan);\n if (!isValidPlan(plan)) return FALLBACK_PLAN;\n return plan;\n } catch {\n return FALLBACK_PLAN;\n } finally {\n clearTimeout(timer);\n }\n };\n}\n\nfunction isValidPlan(p: unknown): p is AdaptationPlan {\n if (!p || typeof p !== \"object\") return false;\n const plan = p as Partial<AdaptationPlan>;\n if (!Array.isArray(plan.adaptations)) return false;\n if (typeof plan.confidence !== \"number\") return false;\n if (typeof plan.reasoning !== \"string\") return false;\n return true;\n}\n"],"mappings":";AAAA,YAAY,WAAW;;;ACAvB,SAAS,WAAW,QAAQ,gBAAgB;AA0B5C,IAAM,oBAAoB;AAC1B,IAAM,eAAe;AACrB,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAE1B,SAAS,YAAY,IAAgC;AACnD,MAAI,EAAE,cAAc,aAAc,QAAO;AACzC,QAAM,UAAU,GAAG,aAAa,eAAe;AAC/C,MAAI,QAAS,QAAO,mBAAmB,OAAO;AAC9C,MAAI,GAAG,GAAI,QAAO,IAAI,GAAG,EAAE;AAC3B,QAAM,SAAS,GAAG,aAAa,aAAa;AAC5C,MAAI,OAAQ,QAAO,iBAAiB,MAAM;AAC1C,SAAO,GAAG,QAAQ,YAAY;AAChC;AAEA,SAAS,eACP,QACA,YACA,aACA,QAC2B;AAC3B,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,cAAc,MAAM;AAE1B,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,MAAI,mBAAmB;AACvB,MAAI,aAAa;AACjB,QAAM,eAAe,oBAAI,IAAY;AACrC,MAAI,YACF,OAAO,WAAW,cAAc,OAAO,cAAc,IAAI;AAC3D,MAAI,YACF,OAAO,WAAW,cAAc,OAAO,eAAe,IAAI;AAE5D,aAAW,MAAM,QAAQ;AACvB,YAAQ,GAAG,MAAM;AAAA,MACf,KAAK;AACH,YAAI,GAAG,KAAK,YAAa,kBAAiB;AAC1C;AAAA,MACF,KAAK;AACH,sBAAc;AACd;AAAA,MACF,KAAK;AACH,oBAAY,GAAG;AACf,sBAAc;AACd;AAAA,MACF,KAAK;AACH,YAAI,GAAG,QAAQ,UAAW,aAAY,GAAG;AACzC;AAAA,MACF,KAAK;AACH,qBAAa,IAAI,GAAG,MAAM;AAC1B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,4BAAoB;AACpB;AAAA,MACF,KAAK;AACH,sBAAc;AACd;AAAA,MACF,KAAK;AACH,oBAAY,GAAG;AACf,oBAAY,GAAG;AACf;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,cAAc,eAAe,IAAI,IAAI,KAAK,MAAM,WAAW,UAAU;AAAA,IACrE,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC;AAAA,IAChD,aAAa,aAAa;AAAA,IAC1B,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,aAAa,KAAK,IAAI,OAAO,QAAQ,UAAU;AAAA,IAC/C,UAAU,EAAE,OAAO,WAAW,QAAQ,UAAU;AAAA,IAChD;AAAA,IACA,cAAc;AAAA,EAChB;AACF;AAEO,SAAS,mBACd,MACmC;AACnC,QAAM;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,YAAY,OAAwB,CAAC,CAAC;AAC5C,QAAM,gBAAgB,OAAO,CAAC;AAC9B,QAAM,iBAAiB,OAAO,KAAK,IAAI,CAAC;AACxC,QAAM,gBAAgB,OAA4B,oBAAI,IAAI,CAAC;AAC3D,QAAM,gBAAgB,OAA4B,oBAAI,IAAI,CAAC;AAC3D,QAAM,iBAAiB,OAA4B,oBAAI,IAAI,CAAC;AAC5D,QAAM,kBAAkB,OAA8B,oBAAI,IAAI,CAAC;AAC/D,QAAM,eAAe,OAAsB,IAAI;AAC/C,QAAM,eAAe,OAAsB,IAAI;AAC/C,QAAM,gBAAgB,OAAkD,CAAC,CAAC;AAE1E,QAAM,aAAa,OAAO,OAAO;AACjC,QAAM,iBAAiB,OAAO,WAAW;AACzC,YAAU,MAAM;AACd,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,OAAO,CAAC;AACZ,YAAU,MAAM;AACd,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,CAAC,cAAc,eAAe,IAAI,SAA0B,CAAC,CAAC;AAEpE,QAAM,YAAY,CAAC,OAAsB;AACvC,UAAM,MAAM,UAAU;AACtB,QAAI,KAAK,EAAE;AACX,QAAI,IAAI,SAAS,WAAY,KAAI,OAAO,GAAG,IAAI,SAAS,UAAU;AAClE,kBAAc,WAAW;AAEzB,oBAAgB,CAAC,SAAS;AACxB,YAAM,OAAO,CAAC,GAAG,MAAM,EAAE;AACzB,UAAI,KAAK,SAAS,mBAAmB;AACnC,aAAK,OAAO,GAAG,KAAK,SAAS,iBAAiB;AAAA,MAChD;AACA,aAAO;AAAA,IACT,CAAC;AAED,QAAI,cAAc,WAAW,kBAAkB;AAC7C,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AAClB,UAAM,UAAU;AAAA,MACd,UAAU;AAAA,MACV;AAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,IAChB;AACA,kBAAc,UAAU;AACxB,mBAAe,UAAU,KAAK,IAAI;AAClC,eAAW,QAAQ,OAAO;AAAA,EAC5B;AAGA,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,UAAU,WAAW,EAAG;AAC1C,UAAM,MAAM,UAAU;AACtB,UAAM,OAAO,UAAU,OAAO,CAAC,GAAG,MAAO,EAAE,IAAI,IAAI,EAAE,IAAI,GAAI,SAAS;AACtE,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,OAAO,SAAS,IAAI,IAAI,MAAM,OAAO;AACpD,UAAM,UAAU,UAAU,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,OAAO,EAAE;AAChE,QAAI,KAAK,GAAG,OAAO;AACnB,QAAI,IAAI,SAAS,WAAY,KAAI,OAAO,GAAG,IAAI,SAAS,UAAU;AAClE,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,IAChB;AACA,kBAAc,UAAU;AACxB,mBAAe,UAAU,KAAK,IAAI;AAClC,eAAW,QAAQ,OAAO;AAAA,EAG5B,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,eAAe,OAAO,aAAa,YAAa;AACtE,UAAM,KACJ,cAAc,YACb,OAAO,aAAa,cAAc,SAAS,OAAO;AACrD,QAAI,CAAC,GAAI;AAET,UAAM,UAAU,CAAC,MAAkB;AACjC,YAAM,QAAQ,YAAY,EAAE,MAAM;AAClC,YAAM,IAAI,KAAK,IAAI;AACnB,gBAAU,EAAE,MAAM,SAAS,QAAQ,OAAO,EAAE,CAAC;AAG7C,YAAM,SAAS,gBAAgB,QAAQ,IAAI,KAAK,KAAK,CAAC;AACtD,YAAM,WAAW,OAAO;AAAA,QACtB,CAAC,SAAS,IAAI,OAAO;AAAA,MACvB;AACA,eAAS,KAAK,CAAC;AACf,sBAAgB,QAAQ,IAAI,OAAO,QAAQ;AAC3C,UAAI,SAAS,UAAU,sBAAsB;AAC3C,kBAAU;AAAA,UACR,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO,SAAS;AAAA,UAChB;AAAA,QACF,CAAC;AACD,wBAAgB,QAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,MACvC;AAAA,IACF;AAEA,UAAM,cAAc,CAAC,MAAkB;AACrC,YAAM,QAAQ,YAAY,EAAE,MAAM;AAClC,UAAI,CAAC,cAAc,QAAQ,IAAI,KAAK,GAAG;AACrC,sBAAc,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,MAC7C;AAAA,IACF;AAEA,UAAM,aAAa,CAAC,MAAkB;AACpC,YAAM,QAAQ,YAAY,EAAE,MAAM;AAClC,YAAM,UAAU,cAAc,QAAQ,IAAI,KAAK;AAC/C,UAAI,WAAW,KAAM;AACrB,oBAAc,QAAQ,OAAO,KAAK;AAClC,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,UAAI,aAAa,aAAc;AAC/B,YAAM,IAAI,KAAK,IAAI;AACnB,gBAAU,EAAE,MAAM,SAAS,QAAQ,OAAO,YAAY,EAAE,CAAC;AACzD,gBAAU,EAAE,MAAM,SAAS,QAAQ,OAAO,YAAY,EAAE,CAAC;AAAA,IAC3D;AAEA,UAAM,YAAY,CAAC,MAAkB;AACnC,YAAM,QAAQ,YAAY,EAAE,MAAM;AAClC,oBAAc,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC;AAC3C,gBAAU,EAAE,MAAM,SAAS,QAAQ,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;AAAA,IAC3D;AAEA,UAAM,aAAa,CAAC,MAAkB;AACpC,YAAM,QAAQ,YAAY,EAAE,MAAM;AAClC,YAAM,UAAU,cAAc,QAAQ,IAAI,KAAK;AAC/C,UAAI,WAAW,KAAM;AACrB,oBAAc,QAAQ,OAAO,KAAK;AAClC,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,UAAI,aAAa,aAAc;AAC/B,gBAAU;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,GAAG,KAAK,IAAI;AAAA,MACd,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,CAAC,MAAa;AAC5B,YAAM,SAAS,EAAE;AACjB,UACE,EACE,kBAAkB,oBAClB,kBAAkB,uBAClB,kBAAkB,qBACjB,kBAAkB,eAChB,OAAuB,oBAE5B;AACA;AAAA,MACF;AACA,YAAM,QAAQ,YAAY,MAAM;AAChC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,OAAO,eAAe,QAAQ,IAAI,KAAK,KAAK;AAClD,UAAI,MAAM,OAAO,kBAAmB;AACpC,qBAAe,QAAQ,IAAI,OAAO,GAAG;AACrC,gBAAU,EAAE,MAAM,SAAS,QAAQ,OAAO,GAAG,IAAI,CAAC;AAAA,IACpD;AAEA,UAAM,WAAW,CAAC,MAAa;AAC7B,YAAM,QAAQ,YAAY,EAAE,MAAM;AAClC,gBAAU,EAAE,MAAM,UAAU,QAAQ,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;AAAA,IAC5D;AAEA,UAAM,qBAAqB,MAAM;AAC/B,YAAM,OAAO,GAAG,sBAAsB;AACtC,YAAM,gBAAgB,OAAO,eAAe;AAC5C,YAAM,WAAW,GAAG,gBAAgB,KAAK,UAAU;AACnD,YAAM,gBAAgB,KAAK,IAAI,KAAK,QAAQ,aAAa;AACzD,YAAM,eAAe,KAAK,IAAI,GAAG,gBAAgB,KAAK,GAAG;AACzD,aAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,eAAe,QAAQ,CAAC;AAAA,IACzD;AAEA,UAAM,WAAW,MAAM;AACrB,UAAI,aAAa,WAAW,KAAM;AAClC,mBAAa,UAAU,sBAAsB,MAAM;AACjD,qBAAa,UAAU;AACvB,kBAAU;AAAA,UACR,MAAM;AAAA,UACN,OAAO,mBAAmB;AAAA,UAC1B,GAAG,KAAK,IAAI;AAAA,QACd,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,MAAM;AACrB,UAAI,aAAa,WAAW,KAAM;AAClC,mBAAa,UAAU,sBAAsB,MAAM;AACjD,qBAAa,UAAU;AACvB,kBAAU;AAAA,UACR,MAAM;AAAA,UACN,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,GAAG,KAAK,IAAI;AAAA,QACd,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,CAAC,MAAkB;AACjC,gBAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS,OAAO,EAAE,WAAW,SAAS;AAAA,QACtC,GAAG,KAAK,IAAI;AAAA,MACd,CAAC;AAAA,IACH;AAEA,UAAM,uBAAuB,CAAC,MAA6B;AACzD,gBAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS,wBAAwB,OAAO,EAAE,UAAU,SAAS,CAAC;AAAA,QAC9D,GAAG,KAAK,IAAI;AAAA,MACd,CAAC;AAAA,IACH;AAEA,OAAG,iBAAiB,SAAS,OAAO;AACpC,OAAG,iBAAiB,aAAa,WAAW;AAC5C,OAAG,iBAAiB,YAAY,UAAU;AAC1C,OAAG,iBAAiB,WAAW,SAAS;AACxC,OAAG,iBAAiB,YAAY,UAAU;AAC1C,OAAG,iBAAiB,SAAS,OAAO;AACpC,OAAG,iBAAiB,UAAU,QAAQ;AACtC,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,iBAAiB,SAAS,OAAO;AACxC,WAAO,iBAAiB,sBAAsB,oBAAoB;AAGlE,UAAM,WAA8B,CAAC;AACrC,QAAI,iBAAiB;AACnB,iBAAW,YAAY,iBAAiB;AACtC,YAAI;AACF,gBAAM,UAAU,SAAS,OAAO,IAAI,SAAS;AAC7C,mBAAS,KAAK,OAAO;AAAA,QACvB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,YAAY,MAAM;AACxC,UAAI,KAAK,IAAI,IAAI,eAAe,WAAW,cAAc;AACvD,cAAM;AAAA,MACR;AAAA,IACF,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,eAAe,CAAC,CAAC,CAAC;AAE9C,WAAO,MAAM;AACX,SAAG,oBAAoB,SAAS,OAAO;AACvC,SAAG,oBAAoB,aAAa,WAAW;AAC/C,SAAG,oBAAoB,YAAY,UAAU;AAC7C,SAAG,oBAAoB,WAAW,SAAS;AAC3C,SAAG,oBAAoB,YAAY,UAAU;AAC7C,SAAG,oBAAoB,SAAS,OAAO;AACvC,SAAG,oBAAoB,UAAU,QAAQ;AACzC,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,aAAO,oBAAoB,SAAS,OAAO;AAC3C,aAAO,oBAAoB,sBAAsB,oBAAoB;AACrE,aAAO,cAAc,QAAQ;AAC7B,UAAI,aAAa,WAAW,MAAM;AAChC,6BAAqB,aAAa,OAAO;AAAA,MAC3C;AACA,UAAI,aAAa,WAAW,MAAM;AAChC,6BAAqB,aAAa,OAAO;AAAA,MAC3C;AACA,iBAAW,WAAW,UAAU;AAC9B,YAAI;AACF,kBAAQ;AAAA,QACV,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,cAAc,cAAc,kBAAkB,UAAU,CAAC;AAE7D,SAAO,EAAE,aAAa;AACxB;;;ACvZA,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAeM,IAAM,mBAAN,MAAuB;AAAA,EAO5B,YAAY,MAA4B;AAHxC,SAAQ,YAAwB,CAAC;AACjC,SAAQ,kBAAgC,CAAC;AAGvC,SAAK,OAAO,KAAK;AACjB,SAAK,QAAQ,KAAK,SAAS,CAAC;AAC5B,SAAK,UAAU,KAAK;AAAA,EACtB;AAAA;AAAA,EAGA,MAAM,MAA4B;AAChC,SAAK,UAAU;AACf,eAAW,cAAc,KAAK,aAAa;AACzC,WAAK,SAAS,UAAU;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAGA,YAAkB;AAChB,QAAI,KAAK,UAAU,WAAW,EAAG;AACjC,UAAM,QAAQ,KAAK,UAAU;AAE7B,aAAS,IAAI,KAAK,UAAU,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,UAAI;AACF,aAAK,UAAU,CAAC,EAAE;AAAA,MACpB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,SAAK,YAAY,CAAC;AAClB,SAAK,kBAAkB,CAAC;AACxB,SAAK,UAAU,EAAE,MAAM,YAAY,MAAM,CAAC;AAAA,EAC5C;AAAA;AAAA,EAGA,aAAwC;AACtC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAIQ,SAAS,YAA8B;AAC7C,UAAM,WAAW,KAAK,eAAe,UAAU;AAC/C,QAAI,aAAa,KAAM;AACvB,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,UAAU,EAAE,MAAM,WAAW,YAAY,QAAQ,WAAW,CAAC;AAClE;AAAA,IACF;AAGA,QACE,WAAW,SAAS,eACpB,yBAAyB,IAAI,WAAW,SAAS,YAAY,CAAC,GAC9D;AACA,WAAK,UAAU;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,8BAA8B,WAAW,QAAQ;AAAA,MAC3D,CAAC;AACD;AAAA,IACF;AAEA,eAAW,MAAM,UAAU;AACzB,YAAM,SAAS,KAAK,eAAe,IAAI,UAAU;AACjD,UAAI,OAAQ,MAAK,UAAU,KAAK,MAAM;AAAA,IACxC;AACA,SAAK,gBAAgB,KAAK,UAAU;AACpC,SAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN;AAAA,MACA,SAAS,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,YAA8C;AACnE,UAAM,MAAM,WAAW;AACvB,QAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAK,UAAU;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,MAAM,MAAM,KAAK,CAAC,MAAM,KAAK,uBAAuB,KAAK,CAAC,CAAC,GAAG;AACrE,WAAK,UAAU,EAAE,MAAM,WAAW,YAAY,QAAQ,aAAa,CAAC;AACpE,aAAO;AAAA,IACT;AACA,QACE,KAAK,MAAM,SACX,CAAC,KAAK,MAAM,MAAM,KAAK,CAAC,MAAM,KAAK,uBAAuB,KAAK,CAAC,CAAC,GACjE;AACA,WAAK,UAAU;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AAGF,UAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,eAAO,CAAC,SAAS,eAAe;AAAA,MAClC;AACA,cAAQ,KAAK,KAAK,iBAAiB,GAAG;AAAA,IACxC,QAAQ;AACN,WAAK,UAAU;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,aAAO;AAAA,IACT;AACA,WAAO,MAAM,KAAK,KAAK,EAAE;AAAA,MACvB,CAAC,MAAwB,aAAa;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,uBAAuB,UAAkB,SAA0B;AAGzE,QAAI,aAAa,QAAS,QAAO;AACjC,WAAO,SAAS,SAAS,OAAO;AAAA,EAClC;AAAA,EAEQ,eACN,IACA,YACiB;AACjB,YAAQ,WAAW,MAAM;AAAA,MACvB,KAAK,eAAe;AAClB,cAAM,OAAO,GAAG,MAAM,iBAAiB,WAAW,IAAI;AACtD,cAAM,eAAe,GAAG,MAAM,oBAAoB,WAAW,IAAI;AACjE,WAAG,MAAM,YAAY,WAAW,MAAM,WAAW,KAAK;AACtD,eAAO,MAAM;AACX,cAAI,KAAM,IAAG,MAAM,YAAY,WAAW,MAAM,MAAM,YAAY;AAAA,cAC7D,IAAG,MAAM,eAAe,WAAW,IAAI;AAAA,QAC9C;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,YAAI,GAAG,UAAU,SAAS,WAAW,SAAS,EAAG,QAAO;AACxD,WAAG,UAAU,IAAI,WAAW,SAAS;AACrC,eAAO,MAAM,GAAG,UAAU,OAAO,WAAW,SAAS;AAAA,MACvD;AAAA,MACA,KAAK,gBAAgB;AACnB,YAAI,CAAC,GAAG,UAAU,SAAS,WAAW,SAAS,EAAG,QAAO;AACzD,WAAG,UAAU,OAAO,WAAW,SAAS;AACxC,eAAO,MAAM,GAAG,UAAU,IAAI,WAAW,SAAS;AAAA,MACpD;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,OAAO,WAAW;AACxB,cAAM,OAAO,GAAG,MAAM,iBAAiB,IAAI;AAC3C,cAAM,eAAe,GAAG,MAAM,oBAAoB,IAAI;AACtD,WAAG,MAAM,YAAY,MAAM,WAAW,KAAK;AAC3C,eAAO,MAAM;AACX,cAAI,KAAM,IAAG,MAAM,YAAY,MAAM,MAAM,YAAY;AAAA,cAClD,IAAG,MAAM,eAAe,IAAI;AAAA,QACnC;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AACpB,cAAM,MAAM,GAAG,aAAa,WAAW,IAAI;AAC3C,cAAM,OAAO,GAAG,aAAa,WAAW,IAAI;AAC5C,WAAG,aAAa,WAAW,MAAM,WAAW,KAAK;AACjD,eAAO,MAAM;AACX,cAAI,OAAO,SAAS,KAAM,IAAG,aAAa,WAAW,MAAM,IAAI;AAAA,cAC1D,IAAG,gBAAgB,WAAW,IAAI;AAAA,QACzC;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,MAAM,GAAG,aAAa,YAAY;AACxC,cAAM,OAAO,GAAG,aAAa,YAAY;AACzC,WAAG,aAAa,cAAc,WAAW,KAAK;AAC9C,eAAO,MAAM;AACX,cAAI,OAAO,SAAS,KAAM,IAAG,aAAa,cAAc,IAAI;AAAA,cACvD,IAAG,gBAAgB,YAAY;AAAA,QACtC;AAAA,MACF;AAAA,MACA,SAAS;AAEP,cAAM,cAAqB;AAC3B,aAAK;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;;;AClNO,SAAS,yBACd,MACA,OAAwB,CAAC,GACf;AACV,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AACpE,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAM,KAAK,gBAAgB;AACjC,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AAEvB,QAAM,YAAY,OAAO,eAAe;AACxC,QAAM,YAAY,OAAO,cAAc;AAEvC,QAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,cAAc;AAAA,IACtE,YAAY,CAACA,UAAS;AACpB,UAAI,EAAEA,iBAAgB,aAAc,QAAO,WAAW;AAEtD,YAAM,OAAOA,MAAK,sBAAsB;AACxC,UAAI,KAAK,UAAU,KAAK,KAAK,WAAW,EAAG,QAAO,WAAW;AAC7D,UAAI,KAAK,SAAS,KAAK,KAAK,MAAM,UAAW,QAAO,WAAW;AAC/D,UAAI,KAAK,QAAQ,KAAK,KAAK,OAAO,UAAW,QAAO,WAAW;AAC/D,aAAO,WAAW;AAAA,IACpB;AAAA,EACF,CAAC;AAED,MAAI,OAAO,OAAO,SAAS;AAC3B,SAAO,QAAQ,IAAI,SAAS,KAAK;AAC/B,QAAI,gBAAgB,aAAa;AAC/B,YAAM,MAAM,aAAa,IAAI;AAC7B,UAAI,OAAO,CAAC,KAAK,IAAI,GAAG,KAAK,YAAY,KAAK,KAAK,KAAK,GAAG;AACzD,aAAK,IAAI,GAAG;AACZ,YAAI,KAAK,GAAG;AAAA,MACd;AAAA,IACF;AACA,WAAO,OAAO,SAAS;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,aAAa,IAAgC;AAEpD,MAAI,GAAG,GAAI,QAAO,IAAI,UAAU,GAAG,EAAE,CAAC;AAGtC,QAAM,UAAU,GAAG,aAAa,eAAe;AAC/C,MAAI,QAAS,QAAO,mBAAmB,WAAW,OAAO,CAAC;AAG1D,QAAM,SAAS,GAAG,aAAa,aAAa;AAC5C,MAAI,OAAQ,QAAO,iBAAiB,WAAW,MAAM,CAAC;AAGtD,QAAM,OAAO,GAAG,aAAa,MAAM;AACnC,MAAI,KAAM,QAAO,GAAG,GAAG,QAAQ,YAAY,CAAC,UAAU,WAAW,IAAI,CAAC;AAGtE,QAAM,WAAW,cAAc,IAAI,GAAG,QAAQ,YAAY,CAAC;AAC3D,MAAI,UAAU;AACZ,UAAM,OAAO,GAAG,aAAa,YAAY;AACzC,QAAI,MAAM;AACR,aAAO,GAAG,GAAG,QAAQ,YAAY,CAAC,gBAAgB,WAAW,IAAI,CAAC;AAAA,IACpE;AACA,WAAO,GAAG,QAAQ,YAAY;AAAA,EAChC;AAGA,QAAM,MAAM,gBAAgB,EAAE;AAC9B,MAAI,IAAK,QAAO,IAAI,UAAU,GAAG,CAAC;AAElC,SAAO;AACT;AAEA,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,gBAAgB,IAAgC;AAEvD,aAAW,OAAO,GAAG,WAAW;AAC9B,QAAI,IAAI,SAAS,GAAG,EAAG;AACvB,QAAI,sBAAsB,KAAK,GAAG,EAAG;AACrC,QAAI,IAAI,SAAS,EAAG;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,UAAkB,OAA4B;AACjE,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,MAAM,KAAK,CAAC,MAAM,aAAa,KAAK,SAAS,SAAS,CAAC,CAAC,GAAG;AACnE,WAAO;AAAA,EACT;AACA,MACE,MAAM,SACN,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,aAAa,KAAK,SAAS,SAAS,CAAC,CAAC,GAC/D;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,UAAU,GAAmB;AACpC,MAAI,OAAO,QAAQ,eAAe,OAAO,IAAI,WAAW,YAAY;AAClE,WAAO,IAAI,OAAO,CAAC;AAAA,EACrB;AACA,SAAO,EAAE,QAAQ,mBAAmB,MAAM;AAC5C;AAEA,SAAS,WAAW,GAAmB;AACrC,SAAO,EAAE,QAAQ,MAAM,KAAK;AAC9B;;;AH+FI;AAnLJ,IAAM,eAAqB,oBAA6C,IAAI;AAErE,SAAS,kBAA6E;AAC3F,QAAM,MAAY,iBAAW,YAAY;AACzC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;AAEO,SAAS,cACd,OACoB;AACpB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,YAAkB,aAAgC,IAAI;AAE5D,QAAM,CAAC,SAAS,UAAU,IAAU,eAA2C,IAAI;AACnF,QAAM,CAAC,UAAU,WAAW,IAAU,eAAgC,IAAI;AAC1E,QAAM,CAAC,oBAAoB,qBAAqB,IAAU,eAExD,CAAC,CAAC;AAEJ,QAAM,oBAA0B,aAAO,CAAC;AACxC,QAAM,cAAoB,aAAO,KAAK;AACtC,QAAM,yBAA+B,aAAO,CAAC;AAC7C,QAAM,kBAAwB,aAAsB,IAAI;AAExD,QAAM,cAAoB,aAAO,QAAQ;AACzC,EAAM,gBAAU,MAAM;AACpB,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,kBAAwB,aAAO,YAAY;AACjD,EAAM,gBAAU,MAAM;AACpB,oBAAgB,UAAU;AAAA,EAC5B,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,iBAAuB,aAAO,WAAW;AAC/C,EAAM,gBAAU,MAAM;AACpB,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,WAAiB,aAAO,KAAK;AACnC,EAAM,gBAAU,MAAM;AACpB,aAAS,UAAU;AAAA,EACrB,GAAG,CAAC,KAAK,CAAC;AAGV,EAAM,gBAAU,MAAM;AACpB,QAAI,OAAO,aAAa,YAAa;AACrC,UAAM,OAAO,cAAc,WAAW,SAAS;AAC/C,QAAI,CAAC,KAAM;AACX,cAAU,UAAU,IAAI,iBAAiB;AAAA,MACvC;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,SAAS,MAAM;AACb,YAAI,UAAU,SAAS;AACrB,gCAAsB,UAAU,QAAQ,WAAW,EAAE,MAAM,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,MAAM;AACX,gBAAU,SAAS,UAAU;AAC7B,gBAAU,UAAU;AAAA,IACtB;AAAA,EAEF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAoB;AAAA,IACxB,OAAO,MAAiC;AACtC,iBAAW,CAAC;AACZ,6BAAuB,WAAW;AAElC,YAAM,KAAK,YAAY;AACvB,UAAI,CAAC,GAAI;AACT,UAAI,YAAY,QAAS;AACzB,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,MAAM,kBAAkB,UAAU,YAAa;AACnD,UAAI,uBAAuB,UAAU,mBAAoB;AAEzD,wBAAkB,UAAU;AAC5B,6BAAuB,UAAU;AACjC,kBAAY,UAAU;AAEtB,UAAI;AACF,cAAM,OACH,cAAc,YAAY,OAAO,aAAa,cAAc,SAAS,OAAO,SAC7E;AACF,cAAM,mBAAmB,OACrB,yBAAyB,MAAM,EAAE,OAAO,SAAS,QAAQ,CAAC,IAC1D,CAAC;AAEL,cAAM,QACH,EAAE,cAAgD,SAAS;AAE9D,cAAM,QAA8B;AAAA,UAClC,SAAS;AAAA,UACT,cAAc,gBAAgB;AAAA,UAC9B,KAAK,EAAE,kBAAkB,MAAM;AAAA,QACjC;AAEA,cAAM,OAAO,MAAM,GAAG,KAAK;AAC3B,YAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,KAAK,WAAW,EAAG;AAG/C,cAAM,OAAO,SAAS,IAAI;AAC1B,YAAI,SAAS,gBAAgB,QAAS;AACtC,wBAAgB,UAAU;AAE1B,oBAAY,IAAI;AAChB,kBAAU,SAAS,MAAM,IAAI;AAAA,MAC/B,QAAQ;AAAA,MAER,UAAE;AACA,oBAAY,UAAU;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAAC,aAAa,oBAAoB,YAAY;AAAA,EAChD;AAEA,qBAA6B;AAAA,IAC3B;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,kBAAwB,aAAqC,CAAC,CAAC;AAKrE,QAAM,YAAkB,kBAAY,CAAC,SAAyB;AAC5D,QAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,KAAK,WAAW,EAAG;AAC/C,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,SAAS,gBAAgB,QAAS;AACtC,oBAAgB,UAAU;AAC1B,gBAAY,IAAI;AAChB,cAAU,SAAS,MAAM,IAAI;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAwB;AAAA,IAC5B,MAAM,gBAAgB;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,QAAM,QAAc;AAAA,IAClB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,SAAS,UAAU,oBAAoB,WAAW,eAAe;AAAA,EACpE;AAEA,SACE,oBAAC,aAAa,UAAb,EAAsB,OACpB,UACH;AAEJ;AAEA,SAAS,SAAS,MAA8B;AAG9C,QAAM,QAAQ,KAAK,YAAY,IAAI,CAAC,MAAM;AACxC,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,IAAI,IAAI,EAAE,KAAK;AAAA,MAC7C,KAAK;AACH,eAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,MACvC,KAAK;AACH,eAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,MACvC,KAAK;AACH,eAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK;AAAA,MACjD,KAAK;AACH,eAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,IAAI,IAAI,EAAE,KAAK;AAAA,MAC7C,KAAK;AACH,eAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,KAAK;AAAA,IACrC;AAAA,EACF,CAAC;AACD,SAAO,MAAM,KAAK,IAAI;AACxB;;;AI9OA,IAAM,gBAAgC;AAAA,EACpC,aAAa,CAAC;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AACb;AAQO,SAAS,kBAAkB,MAAmC;AACnE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,UACJ,cAAc,OAAO,UAAU,cAAc,MAAM,KAAK,UAAU,IAAI;AAExE,SAAO,OAAO,UAAU;AACtB,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,KAAK,IAAI,gBAAgB;AAC/B,UAAM,QAAQ,WAAW,MAAM,GAAG,MAAM,GAAG,SAAS;AAEpD,QAAI;AACF,YAAM,OAAO,gBAAgB,cAAc,KAAK,IAAI;AACpD,YAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,QAC7B,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oBAAoB,GAAG,QAAQ;AAAA,QAC1D,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,QAAQ,GAAG;AAAA,MACb,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,QAAO;AACpB,YAAM,MAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,OAAO,oBAAoB,kBAAkB,GAAG,IAAK;AAC3D,UAAI,CAAC,YAAY,IAAI,EAAG,QAAO;AAC/B,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,YAAY,GAAiC;AACpD,MAAI,CAAC,KAAK,OAAO,MAAM,SAAU,QAAO;AACxC,QAAM,OAAO;AACb,MAAI,CAAC,MAAM,QAAQ,KAAK,WAAW,EAAG,QAAO;AAC7C,MAAI,OAAO,KAAK,eAAe,SAAU,QAAO;AAChD,MAAI,OAAO,KAAK,cAAc,SAAU,QAAO;AAC/C,SAAO;AACT;","names":["node"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "begeniux",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Drop-in adaptive UI engine. Tracks user behavior, asks an agent for a CSS-level adaptation plan, mutates the live DOM in real time.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
7
7
|
"module": "./dist/index.js",
|
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.js",
|
|
13
13
|
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./copilotkit": {
|
|
16
|
+
"types": "./dist/copilotkit.d.ts",
|
|
17
|
+
"import": "./dist/copilotkit.js",
|
|
18
|
+
"require": "./dist/copilotkit.cjs"
|
|
14
19
|
}
|
|
15
20
|
},
|
|
16
21
|
"files": [
|
|
@@ -26,22 +31,32 @@
|
|
|
26
31
|
},
|
|
27
32
|
"peerDependencies": {
|
|
28
33
|
"react": ">=18",
|
|
29
|
-
"react-dom": ">=18"
|
|
34
|
+
"react-dom": ">=18",
|
|
35
|
+
"@copilotkit/react-core": ">=2.0.0",
|
|
36
|
+
"zod": ">=3"
|
|
37
|
+
},
|
|
38
|
+
"peerDependenciesMeta": {
|
|
39
|
+
"@copilotkit/react-core": { "optional": true },
|
|
40
|
+
"zod": { "optional": true }
|
|
30
41
|
},
|
|
31
42
|
"devDependencies": {
|
|
43
|
+
"@copilotkit/react-core": "latest",
|
|
32
44
|
"@types/react": "^18.3.12",
|
|
33
45
|
"@types/react-dom": "^18.3.1",
|
|
34
46
|
"react": "^18.3.1",
|
|
35
47
|
"react-dom": "^18.3.1",
|
|
36
48
|
"tsup": "^8.3.5",
|
|
37
|
-
"typescript": "^5.6.3"
|
|
49
|
+
"typescript": "^5.6.3",
|
|
50
|
+
"zod": "^3.23.8"
|
|
38
51
|
},
|
|
39
52
|
"keywords": [
|
|
40
53
|
"react",
|
|
41
|
-
"generative-ui",
|
|
42
54
|
"adaptive-ui",
|
|
55
|
+
"agentic-ui",
|
|
56
|
+
"generative-ui",
|
|
43
57
|
"ag-ui",
|
|
44
58
|
"copilotkit",
|
|
59
|
+
"langgraph",
|
|
45
60
|
"llm",
|
|
46
61
|
"behavioral-ui"
|
|
47
62
|
],
|