UNPKG

@adonis-agora/agent

Version:

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

72 lines • 3.37 kB
import { createElement } from 'react'; import { createComponentRegistry, } from '../../../genui/index.js'; /** App-scoped registry shared by GenuiProvider and static server rendering. */ export function createReactComponentRegistry(options) { const registry = createComponentRegistry(options); const components = Object.create(null); const texts = new Map(); const paginators = new Map(); const adapter = { get catalog() { return registry.catalog; }, get manifest() { return registry.manifest; }, get components() { return { ...components }; }, prepare: (presentation) => registry.prepare({ ...presentation, props: presentation.props }), render: (presentation, channel) => registry.render({ ...presentation, props: presentation.props }, channel), register(definition, renderers) { const ReactComponent = renderers.react; registry.register(definition, { ...(ReactComponent ? { react: (props) => createElement(ReactComponent, props) } : {}), ...(renderers.text ? { text: renderers.text } : {}), }); if (renderers.react) components[definition.name] = renderers.react; if (renderers.text) { const text = renderers.text; texts.set(definition.name, (props) => text(props)); } if (renderers.paginate) { const paginate = renderers.paginate; paginators.set(definition.name, async (props, size) => (await paginate(props, size))); } return adapter; }, async renderPages(presentation, size) { const pages = await adapter.paginate(presentation, size); return Promise.all(pages.map(async (page) => { const ReactComponent = components[page.component]; if (ReactComponent) return createElement(ReactComponent, page.props); return texts.get(page.component)?.(page.props) ?? page.fallbackText; })); }, async paginate(presentation, size) { if (!Number.isInteger(size) || size < 1 || size > 500) throw new RangeError('genui: rowsPerPage must be 1–500'); const prepared = await registry.prepare({ ...presentation, props: presentation.props, }); const custom = paginators.get(prepared.component); const rows = prepared.props.rows; const pages = custom ? await custom(prepared.props, size) : prepared.component === 'DataTable' && Array.isArray(rows) && rows.length > size ? Array.from({ length: Math.ceil(rows.length / size) }, (_, index) => ({ ...prepared.props, rows: rows.slice(index * size, (index + 1) * size), })) : [prepared.props]; if (!pages.length || pages.length > 100) throw new RangeError('genui: capture requires 1–100 pages'); return Promise.all(pages.map((props) => registry.prepare({ ...prepared, props }))); }, }; return adapter; } //# sourceMappingURL=react-registry.js.map