UNPKG

@adonis-agora/agent

Version:

Governed, durable-backed AI agent (chat + tool-calling + governance) for AdonisJS — part of the Agora ecosystem.

66 lines • 3.3 kB
import { jsx as _jsx } from "react/jsx-runtime"; /** * Optional json-render adapter for tree frames (`@adonis-agora/agent/react/genui/json-render`). * Needs the optional peer `@json-render/react` (>= 0.21). Use it when your app already renders * json-render specs and wants tree frames to go through the same `Renderer` (its state, actions and * visibility machinery); otherwise `<GenerativeUI>` renders trees natively. * * ```tsx * import { GenuiProvider } from '@adonis-agora/agent/react/genui/json-render'; * * <GenuiProvider registry={registry} catalog={catalog} jsonRender>…</GenuiProvider> * ``` */ import { JSONUIProvider, Renderer } from '@json-render/react'; import { useMemo } from 'react'; import { GenuiProvider as BaseGenuiProvider, } from './generative-ui.js'; /** A tree frame's `root` as a json-render flat spec (ids `el-0`, `el-1`, … depth first). */ export function treeToJsonRenderSpec(root) { const elements = {}; let next = 0; const visit = (node) => { const id = `el-${next++}`; const entry = { type: node.type, props: node.props ?? {}, children: [] }; elements[id] = entry; // A node held back while the model writes it (`streaming: 'complete'`) has no props to draw yet. for (const child of node.children ?? []) if (child.held !== true) entry.children.push(visit(child)); return id; }; return { root: visit(root), elements }; } /** * Adapt a genui registry (renderers taking props + `children`) to a json-render registry (renderers * taking `{ element, children }`), so one set of components serves both. */ export function toJsonRenderRegistry(registry) { return Object.fromEntries(Object.entries(registry).map(([name, Renderer]) => [ name, ({ element, children }) => (_jsx(Renderer, { ...(element.props ?? {}), children: children })), ])); } /** Render a tree frame's `root` with json-render. */ export function JsonRenderTree({ root, registry, initialState }) { const spec = useMemo(() => (root === undefined ? null : treeToJsonRenderSpec(root)), [root]); if (spec === null) return null; return (_jsx(JSONUIProvider, { registry: registry, ...(initialState !== undefined ? { initialState } : {}), children: _jsx(Renderer, { spec: spec, registry: registry }) })); } /** A registry entry for `genui:tree` that renders through json-render with `registry`. */ export function jsonRenderTree(registry) { return function JsonRenderTreeFrame({ root }) { return _jsx(JsonRenderTree, { registry: registry, ...(root !== undefined ? { root } : {}) }); }; } /** `GenuiProvider` from `/genui`, plus the {@link GenuiProviderProps.jsonRender} option. */ export function GenuiProvider({ jsonRender, treeRenderer, registry, ...rest }) { const derived = useMemo(() => { if (jsonRender === undefined) return undefined; return jsonRenderTree(jsonRender === true ? toJsonRenderRegistry(registry ?? {}) : jsonRender); }, [jsonRender, registry]); const tree = treeRenderer ?? derived; return (_jsx(BaseGenuiProvider, { ...rest, ...(registry !== undefined ? { registry } : {}), ...(tree !== undefined ? { treeRenderer: tree } : {}) })); } //# sourceMappingURL=json-render.js.map