@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
JavaScript
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