@dudousxd/nestjs-agent-core 0.38.1 → 0.40.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/dist/ag-ui/index.cjs +78 -0
- package/dist/ag-ui/index.cjs.map +1 -1
- package/dist/ag-ui/index.d.cts +12 -2
- package/dist/ag-ui/index.d.ts +12 -2
- package/dist/ag-ui/index.js +77 -0
- package/dist/ag-ui/index.js.map +1 -1
- package/dist/genui/builtins.cjs +2 -0
- package/dist/genui/builtins.cjs.map +1 -1
- package/dist/genui/builtins.js +2 -0
- package/dist/genui/builtins.js.map +1 -1
- package/dist/genui/index.cjs +120 -38
- package/dist/genui/index.cjs.map +1 -1
- package/dist/genui/index.d.cts +2 -2
- package/dist/genui/index.d.ts +2 -2
- package/dist/genui/index.js +116 -37
- package/dist/genui/index.js.map +1 -1
- package/dist/guardrails/index.d.cts +3 -3
- package/dist/guardrails/index.d.ts +3 -3
- package/dist/index.cjs +2524 -148
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +321 -95
- package/dist/index.d.ts +321 -95
- package/dist/index.js +2482 -144
- package/dist/index.js.map +1 -1
- package/dist/{processors-CAVevaYJ.d.cts → processors-B7nfbU6E.d.cts} +3 -1
- package/dist/{processors-C-FP4nDy.d.ts → processors-BR3nICcp.d.ts} +3 -1
- package/dist/{stream-events-rpd3d6gh.d.cts → stream-events-DAmes2Of.d.ts} +704 -86
- package/dist/{stream-events-rpd3d6gh.d.ts → stream-events-M0jc7lSW.d.cts} +704 -86
- package/package.json +1 -1
- package/dist/tool-Dp8HA_f4.d.cts +0 -119
- package/dist/tool-hhssZ_HW.d.ts +0 -119
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/genui/builtins.ts","../../src/genui/catalog.ts"],"sourcesContent":["/**\n * Optional builtin component DEFINITIONS — names, props schemas, model descriptions and plain-text\n * fallbacks for the components most chat apps want. No visuals: an app renders each with its own\n * look, keyed by name. Use them as-is, pick some, or extend them:\n *\n * ```ts\n * const catalog = defineCatalog([...BUILTIN_COMPONENTS, ...LAYOUT_COMPONENTS, myDealCard]);\n * ```\n */\nimport { type ComponentDefinition, defineComponent } from './catalog.js';\nimport type { JsonSchema } from './schema.js';\n\ntype Props = Record<string, any>;\n\nconst str = (description?: string, extra: JsonSchema = {}): JsonSchema => ({\n type: 'string',\n ...(description !== undefined ? { description } : {}),\n ...extra,\n});\nconst obj = (properties: Record<string, JsonSchema>, required: string[] = []): JsonSchema => ({\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n});\nconst arr = (items: JsonSchema, extra: JsonSchema = {}): JsonSchema => ({\n type: 'array',\n items,\n ...extra,\n});\nconst cell: JsonSchema = { type: ['string', 'number', 'boolean', 'null'] };\nconst row: JsonSchema = { type: 'object', additionalProperties: cell };\n\nconst s = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\nconst heading = (props: Props): string => (props.title ? `*${s(props.title)}*\\n` : '');\n\n/** A fixed-width text table in a code block, at most `max` rows. */\nexport function textTable(\n columns: readonly { key: string; label: string }[],\n rows: readonly Props[],\n max = 15,\n): string {\n const shown = rows.slice(0, max);\n const widths = columns.map((column) =>\n Math.min(28, Math.max(column.label.length, ...shown.map((r) => s(r[column.key]).length))),\n );\n const format = (values: string[]) =>\n values\n .map((value, index) => value.slice(0, widths[index]).padEnd(widths[index] ?? 0))\n .join(' ');\n const lines = [\n format(columns.map((column) => column.label)),\n widths.map((width) => '-'.repeat(width)).join(' '),\n ...shown.map((r) => format(columns.map((column) => s(r[column.key])))),\n ];\n if (rows.length > max) lines.push(`… ${rows.length - max} more rows`);\n return `\\`\\`\\`\\n${lines.join('\\n')}\\n\\`\\`\\``;\n}\n\nexport interface DiffLine {\n op: 'same' | 'add' | 'del';\n text: string;\n}\n\n/** Line diff (LCS) — good enough for snippets up to a few hundred lines. */\nexport function lineDiff(before: string, after: string): DiffLine[] {\n const a = before.split('\\n');\n const b = after.split('\\n');\n if (a.length * b.length > 250_000) {\n return [\n ...a.map((text) => ({ op: 'del' as const, text })),\n ...b.map((text) => ({ op: 'add' as const, text })),\n ];\n }\n const dp: number[][] = Array.from({ length: a.length + 1 }, () =>\n new Array<number>(b.length + 1).fill(0),\n );\n const at = (i: number, j: number): number => dp[i]?.[j] ?? 0;\n for (let i = a.length - 1; i >= 0; i--) {\n for (let j = b.length - 1; j >= 0; j--) {\n (dp[i] as number[])[j] =\n a[i] === b[j] ? at(i + 1, j + 1) + 1 : Math.max(at(i + 1, j), at(i, j + 1));\n }\n }\n const out: DiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n if (a[i] === b[j]) {\n out.push({ op: 'same', text: a[i] as string });\n i++;\n j++;\n } else if (at(i + 1, j) >= at(i, j + 1)) {\n out.push({ op: 'del', text: a[i++] as string });\n } else {\n out.push({ op: 'add', text: b[j++] as string });\n }\n }\n while (i < a.length) out.push({ op: 'del', text: a[i++] as string });\n while (j < b.length) out.push({ op: 'add', text: b[j++] as string });\n return out;\n}\n\nfunction bar(value: number, max: number, width = 20): string {\n const n = max > 0 ? Math.round((Math.abs(value) / max) * width) : 0;\n return '█'.repeat(n) || '▏';\n}\n\nexport const DataTable = defineComponent<Props>({\n name: 'DataTable',\n title: 'Data table',\n description:\n 'Tabular data (records with the same fields) as a sortable table. Prefer it over markdown tables for more than 3 rows.',\n props: obj(\n {\n title: str('Short caption'),\n columns: arr(\n obj(\n {\n key: str('Field name in each row'),\n label: str('Column header'),\n align: str(undefined, { enum: ['left', 'right', 'center'] }),\n format: str('How to format values', {\n enum: ['text', 'number', 'currency', 'percent', 'date', 'link'],\n }),\n },\n ['key', 'label'],\n ),\n { minItems: 1, maxItems: 12 },\n ),\n rows: arr(row, { maxItems: 500 }),\n },\n ['columns', 'rows'],\n ),\n fallbackText: (props) => `${heading(props)}${textTable(props.columns ?? [], props.rows ?? [])}`,\n});\n\nexport const Chart = defineComponent<Props>({\n name: 'Chart',\n title: 'Chart',\n description:\n '`bar` to compare categories, `line` for a trend over time. `data` is a list of points; `xKey` names the category/time field and each series names a numeric field.',\n props: obj(\n {\n type: str('Chart type', { enum: ['bar', 'line'] }),\n title: str(),\n xKey: str('Field of each point used for the x axis'),\n series: arr(obj({ key: str('Numeric field'), label: str() }, ['key']), {\n minItems: 1,\n maxItems: 6,\n }),\n data: arr(row, { minItems: 1, maxItems: 200 }),\n unit: str('Unit shown after values, e.g. `KB` or `%`'),\n },\n ['type', 'xKey', 'series', 'data'],\n ),\n fallbackText: (props) => {\n const series: { key: string }[] = props.series ?? [];\n const data: Props[] = props.data ?? [];\n const first = series[0]?.key ?? '';\n const max = Math.max(0, ...data.map((point) => Math.abs(Number(point[first]) || 0)));\n const unit = props.unit ? ` ${s(props.unit)}` : '';\n const lines = data\n .slice(0, 20)\n .map(\n (point) =>\n `${s(point[props.xKey]).slice(0, 18).padEnd(18)} ${bar(Number(point[first]) || 0, max)} ${s(point[first])}${unit}`,\n );\n return `${heading(props)}\\`\\`\\`\\n${lines.join('\\n')}\\n\\`\\`\\``;\n },\n});\n\nexport const KpiCards = defineComponent<Props>({\n name: 'KpiCards',\n title: 'KPI cards',\n description: 'A few key numbers (metrics, totals, counts) as cards.',\n props: obj(\n {\n title: str(),\n items: arr(\n obj(\n {\n label: str(),\n value: { type: ['string', 'number'] },\n delta: str('Change, e.g. `+12%`'),\n trend: str(undefined, { enum: ['up', 'down', 'flat'] }),\n hint: str(),\n },\n ['label', 'value'],\n ),\n { minItems: 1, maxItems: 8 },\n ),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `• *${s(item.label)}:* ${s(item.value)}${item.delta ? ` (${s(item.delta)})` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const SourceCards = defineComponent<Props>({\n name: 'SourceCards',\n title: 'Sources',\n description: 'The documents, pages or links an answer is based on, as cards.',\n props: obj(\n {\n title: str(),\n items: arr(\n obj({ title: str(), url: str(), snippet: str(), source: str('e.g. Wiki, GitHub') }, [\n 'title',\n ]),\n { minItems: 1, maxItems: 12 },\n ),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `• ${item.url ? `<${s(item.url)}|${s(item.title)}>` : s(item.title)}${item.source ? ` — ${s(item.source)}` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const Checklist = defineComponent<Props>({\n name: 'Checklist',\n title: 'Checklist',\n description: 'Steps or a to-do list with done/not-done state.',\n props: obj(\n {\n title: str(),\n items: arr(obj({ label: str(), done: { type: 'boolean' }, note: str() }, ['label']), {\n minItems: 1,\n maxItems: 50,\n }),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `${item.done ? '☑' : '☐'} ${s(item.label)}${item.note ? ` — _${s(item.note)}_` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const Timeline = defineComponent<Props>({\n name: 'Timeline',\n title: 'Timeline',\n description: 'Events in chronological order (the history of a project, an incident, a deal).',\n props: obj(\n {\n title: str(),\n events: arr(obj({ date: str(), title: str(), description: str() }, ['title']), {\n minItems: 1,\n maxItems: 50,\n }),\n },\n ['events'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.events ?? [])\n .map(\n (event: Props) =>\n `• ${event.date ? `*${s(event.date)}* ` : ''}${s(event.title)}${event.description ? ` — ${s(event.description)}` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const CodeBlock = defineComponent<Props>({\n name: 'CodeBlock',\n title: 'Code',\n description: 'A code snippet or file excerpt with syntax highlighting.',\n props: obj({ title: str(), language: str(), code: str() }, ['code']),\n fallbackText: (props) => `${heading(props)}\\`\\`\\`\\n${s(props.code)}\\n\\`\\`\\``,\n});\n\nexport const Diff = defineComponent<Props>({\n name: 'Diff',\n title: 'Diff',\n description: 'A before/after change to a text or code file, as a line diff.',\n props: obj({ title: str(), language: str(), before: str(), after: str() }, ['before', 'after']),\n fallbackText: (props) =>\n `${heading(props)}\\`\\`\\`\\n${lineDiff(s(props.before), s(props.after))\n .map((line) => `${line.op === 'add' ? '+' : line.op === 'del' ? '-' : ' '} ${line.text}`)\n .join('\\n')}\\n\\`\\`\\``,\n});\n\nexport const Callout = defineComponent<Props>({\n name: 'Callout',\n title: 'Callout',\n description: 'A short note, warning or success message, emphasized.',\n props: obj(\n {\n tone: str(undefined, { enum: ['info', 'success', 'warning', 'danger'] }),\n title: str(),\n text: str(),\n },\n ['text'],\n ),\n fallbackText: (props) =>\n `${props.tone === 'warning' || props.tone === 'danger' ? ':warning: ' : ':information_source: '}${heading(props)}${s(props.text)}`,\n});\n\nexport const Stack = defineComponent<Props>({\n name: 'Stack',\n title: 'Stack',\n description: 'Lays its children out vertically (or horizontally with direction=row).',\n props: obj({ direction: str(undefined, { enum: ['column', 'row'] }), gap: { type: 'number' } }),\n children: true,\n fallbackText: () => '',\n});\n\nexport const Card = defineComponent<Props>({\n name: 'Card',\n title: 'Card',\n description: 'A box with an optional title around its children.',\n props: obj({ title: str(), subtitle: str() }),\n children: true,\n fallbackText: (props) =>\n props.title ? `*${s(props.title)}*${props.subtitle ? ` — ${s(props.subtitle)}` : ''}` : '',\n});\n\nexport const Heading = defineComponent<Props>({\n name: 'Heading',\n title: 'Heading',\n description: 'A heading.',\n props: obj({ text: str() }, ['text']),\n fallbackText: (props) => `*${s(props.text)}*`,\n});\n\nexport const Text = defineComponent<Props>({\n name: 'Text',\n title: 'Text',\n description: 'A paragraph of plain text (no markdown).',\n props: obj({ text: str(), muted: { type: 'boolean' } }, ['text']),\n fallbackText: (props) => s(props.text),\n});\n\nexport const Badge = defineComponent<Props>({\n name: 'Badge',\n title: 'Badge',\n description: 'A small label.',\n props: obj(\n {\n text: str(),\n tone: str(undefined, { enum: ['neutral', 'brand', 'success', 'warning', 'danger'] }),\n },\n ['text'],\n ),\n fallbackText: (props) => `[${s(props.text)}]`,\n});\n\nexport const Link = defineComponent<Props>({\n name: 'Link',\n title: 'Link',\n description: 'A link to an http(s) URL.',\n props: obj({ text: str(), url: str(undefined, { pattern: '^https?://' }) }, ['text', 'url']),\n fallbackText: (props) => `<${s(props.url)}|${s(props.text || props.url)}>`,\n});\n\nexport const Image = defineComponent<Props>({\n name: 'Image',\n title: 'Image',\n description: 'An image from an https URL.',\n props: obj({ url: str(undefined, { pattern: '^https://' }), alt: str() }, ['url']),\n fallbackText: (props) => s(props.url),\n});\n\n/** Content components: data a model shows. */\nexport const BUILTIN_COMPONENTS: readonly ComponentDefinition<Props>[] = [\n DataTable,\n Chart,\n KpiCards,\n SourceCards,\n Checklist,\n Timeline,\n CodeBlock,\n Diff,\n Callout,\n];\n\n/** Layout and text primitives, mostly for composing trees (`Stack`, `Card` take children). */\nexport const LAYOUT_COMPONENTS: readonly ComponentDefinition<Props>[] = [\n Stack,\n Card,\n Heading,\n Text,\n Badge,\n Link,\n Image,\n];\n","import {\n type GenuiValidation,\n type JsonSchema,\n type JsonSchemaValidator,\n type PropsSchema,\n builtinJsonSchemaValidator,\n toJsonSchema,\n validateProps,\n validatePropsSync,\n} from './schema.js';\n\n/**\n * One component a server may push into a conversation. Data only — how it LOOKS is each app's own\n * renderer, looked up by {@link name}. The same definition serves the model (description + props\n * schema), the server (validation), text-only channels ({@link fallbackText}) and the client\n * (validation before rendering).\n */\nexport interface ComponentDefinition<P = Record<string, unknown>> {\n /** Registry key, e.g. `DataTable`. What a `ui` frame's `component` names. */\n name: string;\n /** Human label: \"Data table\". */\n title: string;\n /** Shown to the model: what the component is for and when to use it. */\n description: string;\n /** The props schema: a Standard Schema (Zod, Valibot, ArkType) or a JSON Schema object. */\n props: PropsSchema;\n /**\n * The component takes nested elements (a layout: `Stack`, `Card`). Only meaningful in tree mode,\n * where a node's `children` are validated against the catalog too.\n */\n children?: boolean;\n /**\n * Plain text / Slack mrkdwn rendering of these props, for a channel that cannot draw the\n * component. Absent → {@link componentToText} prints the props as JSON.\n */\n fallbackText?: (props: P) => string;\n /**\n * Pushed by the server (e.g. an approval card), never offered to the model. Excluded from\n * {@link catalogToModelText} and from the tool factories.\n */\n internal?: boolean;\n /**\n * Schema version of {@link props}. Stamped on every `ui` frame the component is pushed with, so a\n * client can keep rendering messages persisted under an older shape.\n */\n version?: number;\n}\n\n/** Component names: an identifier a registry key, a tool name and a snake_case slug can all be derived from. */\nexport const COMPONENT_NAME = /^[A-Za-z][A-Za-z0-9]{0,63}$/;\n\n/** Declare a component. Validates the name and returns the definition unchanged (typed). */\nexport function defineComponent<P = Record<string, unknown>>(\n definition: ComponentDefinition<P>,\n): ComponentDefinition<P> {\n if (!COMPONENT_NAME.test(definition.name)) {\n throw new Error(\n `genui: component name \"${definition.name}\" must be letters and digits, starting with a letter (e.g. DataTable)`,\n );\n }\n return definition;\n}\n\nexport interface CatalogOptions {\n /** How JSON Schema props are checked. Default: {@link builtinJsonSchemaValidator}; pass `ajvValidator(new Ajv())` for full JSON Schema. */\n jsonSchemaValidator?: JsonSchemaValidator;\n}\n\n/** An immutable set of component definitions, looked up by name. */\nexport interface Catalog {\n readonly components: readonly ComponentDefinition<any>[];\n readonly validator: JsonSchemaValidator;\n get(name: string): ComponentDefinition<any> | undefined;\n has(name: string): boolean;\n /** The components a model may be offered (every non-`internal` one). */\n modelComponents(): ComponentDefinition<any>[];\n /** Validate `props` for `component`. An unknown component is a validation failure, not a throw. */\n validate(component: string, props: unknown): Promise<GenuiValidation<Record<string, unknown>>>;\n /**\n * {@link validate} without waiting — `undefined` only when the component's Standard Schema\n * validates asynchronously. An unknown component is a failure, as in `validate`.\n */\n validateSync(\n component: string,\n props: unknown,\n ): GenuiValidation<Record<string, unknown>> | undefined;\n /** The component's props as JSON Schema, when it can be derived (see {@link toJsonSchema}). */\n jsonSchemaFor(component: string): JsonSchema | undefined;\n /** A new catalog with these components added (a later definition replaces an earlier one of the same name). */\n extend(components: readonly ComponentDefinition<any>[]): Catalog;\n}\n\n/**\n * Collect component definitions into a {@link Catalog}. Names must be unique; to override a\n * definition (e.g. a builtin), use {@link Catalog.extend}.\n */\nexport function defineCatalog(\n components: readonly ComponentDefinition<any>[],\n options: CatalogOptions = {},\n): Catalog {\n const byName = new Map<string, ComponentDefinition<any>>();\n for (const component of components) {\n defineComponent(component);\n if (byName.has(component.name)) {\n throw new Error(`genui: component \"${component.name}\" is defined twice in one catalog`);\n }\n byName.set(component.name, component);\n }\n return buildCatalog(byName, options.jsonSchemaValidator ?? builtinJsonSchemaValidator);\n}\n\nfunction buildCatalog(\n byName: Map<string, ComponentDefinition<any>>,\n validator: JsonSchemaValidator,\n): Catalog {\n const list = Object.freeze([...byName.values()]);\n return {\n components: list,\n validator,\n get: (name) => byName.get(name),\n has: (name) => byName.has(name),\n modelComponents: () => list.filter((component) => component.internal !== true),\n async validate(component, props) {\n const definition = byName.get(component);\n if (definition === undefined) {\n return {\n ok: false,\n issues: [{ path: [], message: `unknown component \"${component}\"` }],\n };\n }\n const result = await validateProps(definition.props, props, validator);\n return result as GenuiValidation<Record<string, unknown>>;\n },\n validateSync(component, props) {\n const definition = byName.get(component);\n if (definition === undefined) {\n return {\n ok: false,\n issues: [{ path: [], message: `unknown component \"${component}\"` }],\n };\n }\n return validatePropsSync(definition.props, props, validator) as\n | GenuiValidation<Record<string, unknown>>\n | undefined;\n },\n jsonSchemaFor(component) {\n const definition = byName.get(component);\n return definition === undefined ? undefined : toJsonSchema(definition.props);\n },\n extend(more) {\n const next = new Map(byName);\n for (const component of more) {\n defineComponent(component);\n next.set(component.name, component);\n }\n return buildCatalog(next, validator);\n },\n };\n}\n\n/** `DataTable` → `data_table`, `KPICards` → `kpi_cards`. */\nexport function toSnakeCase(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .toLowerCase();\n}\n\n/** The per-component tool name: `ui__show_data_table` with the default prefix. */\nexport function toolNameFor(component: string, prefix = 'ui__show_'): string {\n return `${prefix}${toSnakeCase(component)}`;\n}\n"],"mappings":"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","names":["COMPONENT_NAME","defineComponent","definition","test","name","Error","str","description","extra","type","undefined","obj","properties","required","additionalProperties","arr","items","cell","row","s","value","String","heading","props","title","textTable","columns","rows","max","shown","slice","widths","map","column","Math","min","label","length","r","key","format","values","index","padEnd","join","lines","width","repeat","push","lineDiff","before","after","a","split","b","text","op","dp","Array","from","fill","at","i","j","out","bar","n","round","abs","DataTable","defineComponent","name","align","enum","minItems","maxItems","fallbackText","Chart","xKey","series","data","unit","first","point","Number","KpiCards","delta","trend","hint","item","SourceCards","url","snippet","source","Checklist","done","note","Timeline","events","date","event","CodeBlock","language","code","Diff","line","Callout","tone","Stack","direction","gap","children","Card","subtitle","Heading","Text","muted","Badge","Link","pattern","Image","alt","BUILTIN_COMPONENTS","LAYOUT_COMPONENTS"]}
|
|
1
|
+
{"version":3,"sources":["../../src/genui/builtins.ts","../../src/genui/catalog.ts"],"sourcesContent":["/**\n * Optional builtin component DEFINITIONS — names, props schemas, model descriptions and plain-text\n * fallbacks for the components most chat apps want. No visuals: an app renders each with its own\n * look, keyed by name. Use them as-is, pick some, or extend them:\n *\n * ```ts\n * const catalog = defineCatalog([...BUILTIN_COMPONENTS, ...LAYOUT_COMPONENTS, myDealCard]);\n * ```\n */\nimport { type ComponentDefinition, defineComponent } from './catalog.js';\nimport type { JsonSchema } from './schema.js';\n\ntype Props = Record<string, any>;\n\nconst str = (description?: string, extra: JsonSchema = {}): JsonSchema => ({\n type: 'string',\n ...(description !== undefined ? { description } : {}),\n ...extra,\n});\nconst obj = (properties: Record<string, JsonSchema>, required: string[] = []): JsonSchema => ({\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n});\nconst arr = (items: JsonSchema, extra: JsonSchema = {}): JsonSchema => ({\n type: 'array',\n items,\n ...extra,\n});\nconst cell: JsonSchema = { type: ['string', 'number', 'boolean', 'null'] };\nconst row: JsonSchema = { type: 'object', additionalProperties: cell };\n\nconst s = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\nconst heading = (props: Props): string => (props.title ? `*${s(props.title)}*\\n` : '');\n\n/** A fixed-width text table in a code block, at most `max` rows. */\nexport function textTable(\n columns: readonly { key: string; label: string }[],\n rows: readonly Props[],\n max = 15,\n): string {\n const shown = rows.slice(0, max);\n const widths = columns.map((column) =>\n Math.min(28, Math.max(column.label.length, ...shown.map((r) => s(r[column.key]).length))),\n );\n const format = (values: string[]) =>\n values\n .map((value, index) => value.slice(0, widths[index]).padEnd(widths[index] ?? 0))\n .join(' ');\n const lines = [\n format(columns.map((column) => column.label)),\n widths.map((width) => '-'.repeat(width)).join(' '),\n ...shown.map((r) => format(columns.map((column) => s(r[column.key])))),\n ];\n if (rows.length > max) lines.push(`… ${rows.length - max} more rows`);\n return `\\`\\`\\`\\n${lines.join('\\n')}\\n\\`\\`\\``;\n}\n\nexport interface DiffLine {\n op: 'same' | 'add' | 'del';\n text: string;\n}\n\n/** Line diff (LCS) — good enough for snippets up to a few hundred lines. */\nexport function lineDiff(before: string, after: string): DiffLine[] {\n const a = before.split('\\n');\n const b = after.split('\\n');\n if (a.length * b.length > 250_000) {\n return [\n ...a.map((text) => ({ op: 'del' as const, text })),\n ...b.map((text) => ({ op: 'add' as const, text })),\n ];\n }\n const dp: number[][] = Array.from({ length: a.length + 1 }, () =>\n new Array<number>(b.length + 1).fill(0),\n );\n const at = (i: number, j: number): number => dp[i]?.[j] ?? 0;\n for (let i = a.length - 1; i >= 0; i--) {\n for (let j = b.length - 1; j >= 0; j--) {\n (dp[i] as number[])[j] =\n a[i] === b[j] ? at(i + 1, j + 1) + 1 : Math.max(at(i + 1, j), at(i, j + 1));\n }\n }\n const out: DiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n if (a[i] === b[j]) {\n out.push({ op: 'same', text: a[i] as string });\n i++;\n j++;\n } else if (at(i + 1, j) >= at(i, j + 1)) {\n out.push({ op: 'del', text: a[i++] as string });\n } else {\n out.push({ op: 'add', text: b[j++] as string });\n }\n }\n while (i < a.length) out.push({ op: 'del', text: a[i++] as string });\n while (j < b.length) out.push({ op: 'add', text: b[j++] as string });\n return out;\n}\n\nfunction bar(value: number, max: number, width = 20): string {\n const n = max > 0 ? Math.round((Math.abs(value) / max) * width) : 0;\n return '█'.repeat(n) || '▏';\n}\n\nexport const DataTable = defineComponent<Props>({\n name: 'DataTable',\n title: 'Data table',\n description:\n 'Tabular data (records with the same fields) as a sortable table. Prefer it over markdown tables for more than 3 rows.',\n props: obj(\n {\n title: str('Short caption'),\n columns: arr(\n obj(\n {\n key: str('Field name in each row'),\n label: str('Column header'),\n align: str(undefined, { enum: ['left', 'right', 'center'] }),\n format: str('How to format values', {\n enum: ['text', 'number', 'currency', 'percent', 'date', 'link'],\n }),\n },\n ['key', 'label'],\n ),\n { minItems: 1, maxItems: 12 },\n ),\n rows: arr(row, { maxItems: 500 }),\n },\n ['columns', 'rows'],\n ),\n fallbackText: (props) => `${heading(props)}${textTable(props.columns ?? [], props.rows ?? [])}`,\n});\n\nexport const Chart = defineComponent<Props>({\n name: 'Chart',\n title: 'Chart',\n description:\n '`bar` to compare categories, `line` for a trend over time. `data` is a list of points; `xKey` names the category/time field and each series names a numeric field.',\n props: obj(\n {\n type: str('Chart type', { enum: ['bar', 'line'] }),\n title: str(),\n xKey: str('Field of each point used for the x axis'),\n series: arr(obj({ key: str('Numeric field'), label: str() }, ['key']), {\n minItems: 1,\n maxItems: 6,\n }),\n data: arr(row, { minItems: 1, maxItems: 200 }),\n unit: str('Unit shown after values, e.g. `KB` or `%`'),\n },\n ['type', 'xKey', 'series', 'data'],\n ),\n fallbackText: (props) => {\n const series: { key: string }[] = props.series ?? [];\n const data: Props[] = props.data ?? [];\n const first = series[0]?.key ?? '';\n const max = Math.max(0, ...data.map((point) => Math.abs(Number(point[first]) || 0)));\n const unit = props.unit ? ` ${s(props.unit)}` : '';\n const lines = data\n .slice(0, 20)\n .map(\n (point) =>\n `${s(point[props.xKey]).slice(0, 18).padEnd(18)} ${bar(Number(point[first]) || 0, max)} ${s(point[first])}${unit}`,\n );\n return `${heading(props)}\\`\\`\\`\\n${lines.join('\\n')}\\n\\`\\`\\``;\n },\n});\n\nexport const KpiCards = defineComponent<Props>({\n name: 'KpiCards',\n title: 'KPI cards',\n description: 'A few key numbers (metrics, totals, counts) as cards.',\n props: obj(\n {\n title: str(),\n items: arr(\n obj(\n {\n label: str(),\n value: { type: ['string', 'number'] },\n delta: str('Change, e.g. `+12%`'),\n trend: str(undefined, { enum: ['up', 'down', 'flat'] }),\n hint: str(),\n },\n ['label', 'value'],\n ),\n { minItems: 1, maxItems: 8 },\n ),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `• *${s(item.label)}:* ${s(item.value)}${item.delta ? ` (${s(item.delta)})` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const SourceCards = defineComponent<Props>({\n name: 'SourceCards',\n title: 'Sources',\n description: 'The documents, pages or links an answer is based on, as cards.',\n props: obj(\n {\n title: str(),\n items: arr(\n obj({ title: str(), url: str(), snippet: str(), source: str('e.g. Wiki, GitHub') }, [\n 'title',\n ]),\n { minItems: 1, maxItems: 12 },\n ),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `• ${item.url ? `<${s(item.url)}|${s(item.title)}>` : s(item.title)}${item.source ? ` — ${s(item.source)}` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const Checklist = defineComponent<Props>({\n name: 'Checklist',\n title: 'Checklist',\n description: 'Steps or a to-do list with done/not-done state.',\n props: obj(\n {\n title: str(),\n items: arr(obj({ label: str(), done: { type: 'boolean' }, note: str() }, ['label']), {\n minItems: 1,\n maxItems: 50,\n }),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `${item.done ? '☑' : '☐'} ${s(item.label)}${item.note ? ` — _${s(item.note)}_` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const Timeline = defineComponent<Props>({\n name: 'Timeline',\n title: 'Timeline',\n description: 'Events in chronological order (the history of a project, an incident, a deal).',\n props: obj(\n {\n title: str(),\n events: arr(obj({ date: str(), title: str(), description: str() }, ['title']), {\n minItems: 1,\n maxItems: 50,\n }),\n },\n ['events'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.events ?? [])\n .map(\n (event: Props) =>\n `• ${event.date ? `*${s(event.date)}* ` : ''}${s(event.title)}${event.description ? ` — ${s(event.description)}` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const CodeBlock = defineComponent<Props>({\n name: 'CodeBlock',\n title: 'Code',\n description: 'A code snippet or file excerpt with syntax highlighting.',\n props: obj({ title: str(), language: str(), code: str() }, ['code']),\n fallbackText: (props) => `${heading(props)}\\`\\`\\`\\n${s(props.code)}\\n\\`\\`\\``,\n});\n\nexport const Diff = defineComponent<Props>({\n name: 'Diff',\n title: 'Diff',\n description: 'A before/after change to a text or code file, as a line diff.',\n props: obj({ title: str(), language: str(), before: str(), after: str() }, ['before', 'after']),\n fallbackText: (props) =>\n `${heading(props)}\\`\\`\\`\\n${lineDiff(s(props.before), s(props.after))\n .map((line) => `${line.op === 'add' ? '+' : line.op === 'del' ? '-' : ' '} ${line.text}`)\n .join('\\n')}\\n\\`\\`\\``,\n});\n\nexport const Callout = defineComponent<Props>({\n name: 'Callout',\n title: 'Callout',\n description: 'A short note, warning or success message, emphasized.',\n props: obj(\n {\n tone: str(undefined, { enum: ['info', 'success', 'warning', 'danger'] }),\n title: str(),\n text: str(),\n },\n ['text'],\n ),\n fallbackText: (props) =>\n `${props.tone === 'warning' || props.tone === 'danger' ? ':warning: ' : ':information_source: '}${heading(props)}${s(props.text)}`,\n});\n\nexport const Stack = defineComponent<Props>({\n name: 'Stack',\n title: 'Stack',\n description: 'Lays its children out vertically (or horizontally with direction=row).',\n props: obj({ direction: str(undefined, { enum: ['column', 'row'] }), gap: { type: 'number' } }),\n children: true,\n fallbackText: () => '',\n});\n\nexport const Card = defineComponent<Props>({\n name: 'Card',\n title: 'Card',\n description: 'A box with an optional title around its children.',\n props: obj({ title: str(), subtitle: str() }),\n children: true,\n fallbackText: (props) =>\n props.title ? `*${s(props.title)}*${props.subtitle ? ` — ${s(props.subtitle)}` : ''}` : '',\n});\n\nexport const Heading = defineComponent<Props>({\n name: 'Heading',\n title: 'Heading',\n description: 'A heading.',\n props: obj({ text: str() }, ['text']),\n fallbackText: (props) => `*${s(props.text)}*`,\n});\n\nexport const Text = defineComponent<Props>({\n name: 'Text',\n title: 'Text',\n description: 'A paragraph of plain text (no markdown).',\n props: obj({ text: str(), muted: { type: 'boolean' } }, ['text']),\n fallbackText: (props) => s(props.text),\n});\n\nexport const Badge = defineComponent<Props>({\n name: 'Badge',\n title: 'Badge',\n description: 'A small label.',\n props: obj(\n {\n text: str(),\n tone: str(undefined, { enum: ['neutral', 'brand', 'success', 'warning', 'danger'] }),\n },\n ['text'],\n ),\n fallbackText: (props) => `[${s(props.text)}]`,\n});\n\nexport const Link = defineComponent<Props>({\n name: 'Link',\n title: 'Link',\n description: 'A link to an http(s) URL.',\n props: obj({ text: str(), url: str(undefined, { pattern: '^https?://' }) }, ['text', 'url']),\n fallbackText: (props) => `<${s(props.url)}|${s(props.text || props.url)}>`,\n});\n\nexport const Image = defineComponent<Props>({\n name: 'Image',\n title: 'Image',\n description: 'An image from an https URL.',\n props: obj({ url: str(undefined, { pattern: '^https://' }), alt: str() }, ['url']),\n fallbackText: (props) => s(props.url),\n});\n\n/** Content components: data a model shows. */\nexport const BUILTIN_COMPONENTS: readonly ComponentDefinition<Props>[] = [\n DataTable,\n Chart,\n KpiCards,\n SourceCards,\n Checklist,\n Timeline,\n CodeBlock,\n Diff,\n Callout,\n];\n\n/** Layout and text primitives, mostly for composing trees (`Stack`, `Card` take children). */\nexport const LAYOUT_COMPONENTS: readonly ComponentDefinition<Props>[] = [\n Stack,\n Card,\n Heading,\n Text,\n Badge,\n Link,\n Image,\n];\n","import {\n type GenuiValidation,\n type JsonSchema,\n type JsonSchemaValidator,\n type PropsSchema,\n builtinJsonSchemaValidator,\n toJsonSchema,\n validateProps,\n validatePropsSync,\n} from './schema.js';\n\n/**\n * One component a server may push into a conversation. Data only — how it LOOKS is each app's own\n * renderer, looked up by {@link name}. The same definition serves the model (description + props\n * schema), the server (validation), text-only channels ({@link fallbackText}) and the client\n * (validation before rendering).\n */\nexport interface ComponentDefinition<P = Record<string, unknown>> {\n /** Registry key, e.g. `DataTable`. What a `ui` frame's `component` names. */\n name: string;\n /** Human label: \"Data table\". */\n title: string;\n /** Shown to the model: what the component is for and when to use it. */\n description: string;\n /** The props schema: a Standard Schema (Zod, Valibot, ArkType) or a JSON Schema object. */\n props: PropsSchema;\n /**\n * The component takes nested elements (a layout: `Stack`, `Card`). Only meaningful in tree mode,\n * where a node's `children` are validated against the catalog too.\n */\n children?: boolean;\n /**\n * Plain text / Slack mrkdwn rendering of these props, for a channel that cannot draw the\n * component. Absent → {@link componentToText} prints the props as JSON.\n */\n fallbackText?: (props: P) => string;\n /**\n * Pushed by the server (e.g. an approval card), never offered to the model. Excluded from\n * {@link catalogToModelText} and from the tool factories.\n */\n internal?: boolean;\n /**\n * Schema version of {@link props}. Stamped on every `ui` frame the component is pushed with, so a\n * client can keep rendering messages persisted under an older shape.\n */\n version?: number;\n}\n\n/** Component names: an identifier a registry key, a tool name and a snake_case slug can all be derived from. */\nexport const COMPONENT_NAME = /^[A-Za-z][A-Za-z0-9]{0,63}$/;\n\n/** Declare a component. Validates the name and returns the definition unchanged (typed). */\nexport function defineComponent<P = Record<string, unknown>>(\n definition: ComponentDefinition<P>,\n): ComponentDefinition<P> {\n if (!COMPONENT_NAME.test(definition.name)) {\n throw new Error(\n `genui: component name \"${definition.name}\" must be letters and digits, starting with a letter (e.g. DataTable)`,\n );\n }\n if (\n definition.version !== undefined &&\n (!Number.isSafeInteger(definition.version) || definition.version <= 0)\n )\n throw new RangeError('genui: component version must be a positive safe integer');\n if (definition.fallbackText !== undefined && typeof definition.fallbackText !== 'function')\n throw new TypeError('genui: fallbackText must be a function');\n return definition;\n}\n\nexport interface CatalogOptions {\n /** How JSON Schema props are checked. Default: {@link builtinJsonSchemaValidator}; pass `ajvValidator(new Ajv())` for full JSON Schema. */\n jsonSchemaValidator?: JsonSchemaValidator;\n}\n\n/** An immutable set of component definitions, looked up by name. */\nexport interface Catalog {\n readonly components: readonly ComponentDefinition<any>[];\n readonly validator: JsonSchemaValidator;\n get(name: string): ComponentDefinition<any> | undefined;\n has(name: string): boolean;\n /** The components a model may be offered (every non-`internal` one). */\n modelComponents(): ComponentDefinition<any>[];\n /** Validate `props` for `component`. An unknown component is a validation failure, not a throw. */\n validate(component: string, props: unknown): Promise<GenuiValidation<Record<string, unknown>>>;\n /**\n * {@link validate} without waiting — `undefined` only when the component's Standard Schema\n * validates asynchronously. An unknown component is a failure, as in `validate`.\n */\n validateSync(\n component: string,\n props: unknown,\n ): GenuiValidation<Record<string, unknown>> | undefined;\n /** The component's props as JSON Schema, when it can be derived (see {@link toJsonSchema}). */\n jsonSchemaFor(component: string): JsonSchema | undefined;\n /** A new catalog with these components added (a later definition replaces an earlier one of the same name). */\n extend(components: readonly ComponentDefinition<any>[]): Catalog;\n}\n\n/**\n * Collect component definitions into a {@link Catalog}. Names must be unique; to override a\n * definition (e.g. a builtin), use {@link Catalog.extend}.\n */\nexport function defineCatalog(\n components: readonly ComponentDefinition<any>[],\n options: CatalogOptions = {},\n): Catalog {\n const byName = new Map<string, ComponentDefinition<any>>();\n for (const component of components) {\n defineComponent(component);\n if (byName.has(component.name)) {\n throw new Error(`genui: component \"${component.name}\" is defined twice in one catalog`);\n }\n byName.set(component.name, component);\n }\n return buildCatalog(byName, options.jsonSchemaValidator ?? builtinJsonSchemaValidator);\n}\n\nfunction buildCatalog(\n byName: Map<string, ComponentDefinition<any>>,\n validator: JsonSchemaValidator,\n): Catalog {\n const list = Object.freeze([...byName.values()]);\n return {\n components: list,\n validator,\n get: (name) => byName.get(name),\n has: (name) => byName.has(name),\n modelComponents: () => list.filter((component) => component.internal !== true),\n async validate(component, props) {\n const definition = byName.get(component);\n if (definition === undefined) {\n return {\n ok: false,\n issues: [{ path: [], message: `unknown component \"${component}\"` }],\n };\n }\n const result = await validateProps(definition.props, props, validator);\n return result as GenuiValidation<Record<string, unknown>>;\n },\n validateSync(component, props) {\n const definition = byName.get(component);\n if (definition === undefined) {\n return {\n ok: false,\n issues: [{ path: [], message: `unknown component \"${component}\"` }],\n };\n }\n return validatePropsSync(definition.props, props, validator) as\n | GenuiValidation<Record<string, unknown>>\n | undefined;\n },\n jsonSchemaFor(component) {\n const definition = byName.get(component);\n return definition === undefined ? undefined : toJsonSchema(definition.props);\n },\n extend(more) {\n const next = new Map(byName);\n for (const component of more) {\n defineComponent(component);\n next.set(component.name, component);\n }\n return buildCatalog(next, validator);\n },\n };\n}\n\n/** `DataTable` → `data_table`, `KPICards` → `kpi_cards`. */\nexport function toSnakeCase(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .toLowerCase();\n}\n\n/** The per-component tool name: `ui__show_data_table` with the default prefix. */\nexport function toolNameFor(component: string, prefix = 'ui__show_'): string {\n return `${prefix}${toSnakeCase(component)}`;\n}\n"],"mappings":"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","names":["COMPONENT_NAME","defineComponent","definition","test","name","Error","version","undefined","Number","isSafeInteger","RangeError","fallbackText","TypeError","str","description","extra","type","undefined","obj","properties","required","additionalProperties","arr","items","cell","row","s","value","String","heading","props","title","textTable","columns","rows","max","shown","slice","widths","map","column","Math","min","label","length","r","key","format","values","index","padEnd","join","lines","width","repeat","push","lineDiff","before","after","a","split","b","text","op","dp","Array","from","fill","at","i","j","out","bar","n","round","abs","DataTable","defineComponent","name","align","enum","minItems","maxItems","fallbackText","Chart","xKey","series","data","unit","first","point","Number","KpiCards","delta","trend","hint","item","SourceCards","url","snippet","source","Checklist","done","note","Timeline","events","date","event","CodeBlock","language","code","Diff","line","Callout","tone","Stack","direction","gap","children","Card","subtitle","Heading","Text","muted","Badge","Link","pattern","Image","alt","BUILTIN_COMPONENTS","LAYOUT_COMPONENTS"]}
|
package/dist/genui/builtins.js
CHANGED
|
@@ -7,6 +7,8 @@ function defineComponent(definition) {
|
|
|
7
7
|
if (!COMPONENT_NAME.test(definition.name)) {
|
|
8
8
|
throw new Error(`genui: component name "${definition.name}" must be letters and digits, starting with a letter (e.g. DataTable)`);
|
|
9
9
|
}
|
|
10
|
+
if (definition.version !== void 0 && (!Number.isSafeInteger(definition.version) || definition.version <= 0)) throw new RangeError("genui: component version must be a positive safe integer");
|
|
11
|
+
if (definition.fallbackText !== void 0 && typeof definition.fallbackText !== "function") throw new TypeError("genui: fallbackText must be a function");
|
|
10
12
|
return definition;
|
|
11
13
|
}
|
|
12
14
|
__name(defineComponent, "defineComponent");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/genui/catalog.ts","../../src/genui/builtins.ts"],"sourcesContent":["import {\n type GenuiValidation,\n type JsonSchema,\n type JsonSchemaValidator,\n type PropsSchema,\n builtinJsonSchemaValidator,\n toJsonSchema,\n validateProps,\n validatePropsSync,\n} from './schema.js';\n\n/**\n * One component a server may push into a conversation. Data only — how it LOOKS is each app's own\n * renderer, looked up by {@link name}. The same definition serves the model (description + props\n * schema), the server (validation), text-only channels ({@link fallbackText}) and the client\n * (validation before rendering).\n */\nexport interface ComponentDefinition<P = Record<string, unknown>> {\n /** Registry key, e.g. `DataTable`. What a `ui` frame's `component` names. */\n name: string;\n /** Human label: \"Data table\". */\n title: string;\n /** Shown to the model: what the component is for and when to use it. */\n description: string;\n /** The props schema: a Standard Schema (Zod, Valibot, ArkType) or a JSON Schema object. */\n props: PropsSchema;\n /**\n * The component takes nested elements (a layout: `Stack`, `Card`). Only meaningful in tree mode,\n * where a node's `children` are validated against the catalog too.\n */\n children?: boolean;\n /**\n * Plain text / Slack mrkdwn rendering of these props, for a channel that cannot draw the\n * component. Absent → {@link componentToText} prints the props as JSON.\n */\n fallbackText?: (props: P) => string;\n /**\n * Pushed by the server (e.g. an approval card), never offered to the model. Excluded from\n * {@link catalogToModelText} and from the tool factories.\n */\n internal?: boolean;\n /**\n * Schema version of {@link props}. Stamped on every `ui` frame the component is pushed with, so a\n * client can keep rendering messages persisted under an older shape.\n */\n version?: number;\n}\n\n/** Component names: an identifier a registry key, a tool name and a snake_case slug can all be derived from. */\nexport const COMPONENT_NAME = /^[A-Za-z][A-Za-z0-9]{0,63}$/;\n\n/** Declare a component. Validates the name and returns the definition unchanged (typed). */\nexport function defineComponent<P = Record<string, unknown>>(\n definition: ComponentDefinition<P>,\n): ComponentDefinition<P> {\n if (!COMPONENT_NAME.test(definition.name)) {\n throw new Error(\n `genui: component name \"${definition.name}\" must be letters and digits, starting with a letter (e.g. DataTable)`,\n );\n }\n return definition;\n}\n\nexport interface CatalogOptions {\n /** How JSON Schema props are checked. Default: {@link builtinJsonSchemaValidator}; pass `ajvValidator(new Ajv())` for full JSON Schema. */\n jsonSchemaValidator?: JsonSchemaValidator;\n}\n\n/** An immutable set of component definitions, looked up by name. */\nexport interface Catalog {\n readonly components: readonly ComponentDefinition<any>[];\n readonly validator: JsonSchemaValidator;\n get(name: string): ComponentDefinition<any> | undefined;\n has(name: string): boolean;\n /** The components a model may be offered (every non-`internal` one). */\n modelComponents(): ComponentDefinition<any>[];\n /** Validate `props` for `component`. An unknown component is a validation failure, not a throw. */\n validate(component: string, props: unknown): Promise<GenuiValidation<Record<string, unknown>>>;\n /**\n * {@link validate} without waiting — `undefined` only when the component's Standard Schema\n * validates asynchronously. An unknown component is a failure, as in `validate`.\n */\n validateSync(\n component: string,\n props: unknown,\n ): GenuiValidation<Record<string, unknown>> | undefined;\n /** The component's props as JSON Schema, when it can be derived (see {@link toJsonSchema}). */\n jsonSchemaFor(component: string): JsonSchema | undefined;\n /** A new catalog with these components added (a later definition replaces an earlier one of the same name). */\n extend(components: readonly ComponentDefinition<any>[]): Catalog;\n}\n\n/**\n * Collect component definitions into a {@link Catalog}. Names must be unique; to override a\n * definition (e.g. a builtin), use {@link Catalog.extend}.\n */\nexport function defineCatalog(\n components: readonly ComponentDefinition<any>[],\n options: CatalogOptions = {},\n): Catalog {\n const byName = new Map<string, ComponentDefinition<any>>();\n for (const component of components) {\n defineComponent(component);\n if (byName.has(component.name)) {\n throw new Error(`genui: component \"${component.name}\" is defined twice in one catalog`);\n }\n byName.set(component.name, component);\n }\n return buildCatalog(byName, options.jsonSchemaValidator ?? builtinJsonSchemaValidator);\n}\n\nfunction buildCatalog(\n byName: Map<string, ComponentDefinition<any>>,\n validator: JsonSchemaValidator,\n): Catalog {\n const list = Object.freeze([...byName.values()]);\n return {\n components: list,\n validator,\n get: (name) => byName.get(name),\n has: (name) => byName.has(name),\n modelComponents: () => list.filter((component) => component.internal !== true),\n async validate(component, props) {\n const definition = byName.get(component);\n if (definition === undefined) {\n return {\n ok: false,\n issues: [{ path: [], message: `unknown component \"${component}\"` }],\n };\n }\n const result = await validateProps(definition.props, props, validator);\n return result as GenuiValidation<Record<string, unknown>>;\n },\n validateSync(component, props) {\n const definition = byName.get(component);\n if (definition === undefined) {\n return {\n ok: false,\n issues: [{ path: [], message: `unknown component \"${component}\"` }],\n };\n }\n return validatePropsSync(definition.props, props, validator) as\n | GenuiValidation<Record<string, unknown>>\n | undefined;\n },\n jsonSchemaFor(component) {\n const definition = byName.get(component);\n return definition === undefined ? undefined : toJsonSchema(definition.props);\n },\n extend(more) {\n const next = new Map(byName);\n for (const component of more) {\n defineComponent(component);\n next.set(component.name, component);\n }\n return buildCatalog(next, validator);\n },\n };\n}\n\n/** `DataTable` → `data_table`, `KPICards` → `kpi_cards`. */\nexport function toSnakeCase(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .toLowerCase();\n}\n\n/** The per-component tool name: `ui__show_data_table` with the default prefix. */\nexport function toolNameFor(component: string, prefix = 'ui__show_'): string {\n return `${prefix}${toSnakeCase(component)}`;\n}\n","/**\n * Optional builtin component DEFINITIONS — names, props schemas, model descriptions and plain-text\n * fallbacks for the components most chat apps want. No visuals: an app renders each with its own\n * look, keyed by name. Use them as-is, pick some, or extend them:\n *\n * ```ts\n * const catalog = defineCatalog([...BUILTIN_COMPONENTS, ...LAYOUT_COMPONENTS, myDealCard]);\n * ```\n */\nimport { type ComponentDefinition, defineComponent } from './catalog.js';\nimport type { JsonSchema } from './schema.js';\n\ntype Props = Record<string, any>;\n\nconst str = (description?: string, extra: JsonSchema = {}): JsonSchema => ({\n type: 'string',\n ...(description !== undefined ? { description } : {}),\n ...extra,\n});\nconst obj = (properties: Record<string, JsonSchema>, required: string[] = []): JsonSchema => ({\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n});\nconst arr = (items: JsonSchema, extra: JsonSchema = {}): JsonSchema => ({\n type: 'array',\n items,\n ...extra,\n});\nconst cell: JsonSchema = { type: ['string', 'number', 'boolean', 'null'] };\nconst row: JsonSchema = { type: 'object', additionalProperties: cell };\n\nconst s = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\nconst heading = (props: Props): string => (props.title ? `*${s(props.title)}*\\n` : '');\n\n/** A fixed-width text table in a code block, at most `max` rows. */\nexport function textTable(\n columns: readonly { key: string; label: string }[],\n rows: readonly Props[],\n max = 15,\n): string {\n const shown = rows.slice(0, max);\n const widths = columns.map((column) =>\n Math.min(28, Math.max(column.label.length, ...shown.map((r) => s(r[column.key]).length))),\n );\n const format = (values: string[]) =>\n values\n .map((value, index) => value.slice(0, widths[index]).padEnd(widths[index] ?? 0))\n .join(' ');\n const lines = [\n format(columns.map((column) => column.label)),\n widths.map((width) => '-'.repeat(width)).join(' '),\n ...shown.map((r) => format(columns.map((column) => s(r[column.key])))),\n ];\n if (rows.length > max) lines.push(`… ${rows.length - max} more rows`);\n return `\\`\\`\\`\\n${lines.join('\\n')}\\n\\`\\`\\``;\n}\n\nexport interface DiffLine {\n op: 'same' | 'add' | 'del';\n text: string;\n}\n\n/** Line diff (LCS) — good enough for snippets up to a few hundred lines. */\nexport function lineDiff(before: string, after: string): DiffLine[] {\n const a = before.split('\\n');\n const b = after.split('\\n');\n if (a.length * b.length > 250_000) {\n return [\n ...a.map((text) => ({ op: 'del' as const, text })),\n ...b.map((text) => ({ op: 'add' as const, text })),\n ];\n }\n const dp: number[][] = Array.from({ length: a.length + 1 }, () =>\n new Array<number>(b.length + 1).fill(0),\n );\n const at = (i: number, j: number): number => dp[i]?.[j] ?? 0;\n for (let i = a.length - 1; i >= 0; i--) {\n for (let j = b.length - 1; j >= 0; j--) {\n (dp[i] as number[])[j] =\n a[i] === b[j] ? at(i + 1, j + 1) + 1 : Math.max(at(i + 1, j), at(i, j + 1));\n }\n }\n const out: DiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n if (a[i] === b[j]) {\n out.push({ op: 'same', text: a[i] as string });\n i++;\n j++;\n } else if (at(i + 1, j) >= at(i, j + 1)) {\n out.push({ op: 'del', text: a[i++] as string });\n } else {\n out.push({ op: 'add', text: b[j++] as string });\n }\n }\n while (i < a.length) out.push({ op: 'del', text: a[i++] as string });\n while (j < b.length) out.push({ op: 'add', text: b[j++] as string });\n return out;\n}\n\nfunction bar(value: number, max: number, width = 20): string {\n const n = max > 0 ? Math.round((Math.abs(value) / max) * width) : 0;\n return '█'.repeat(n) || '▏';\n}\n\nexport const DataTable = defineComponent<Props>({\n name: 'DataTable',\n title: 'Data table',\n description:\n 'Tabular data (records with the same fields) as a sortable table. Prefer it over markdown tables for more than 3 rows.',\n props: obj(\n {\n title: str('Short caption'),\n columns: arr(\n obj(\n {\n key: str('Field name in each row'),\n label: str('Column header'),\n align: str(undefined, { enum: ['left', 'right', 'center'] }),\n format: str('How to format values', {\n enum: ['text', 'number', 'currency', 'percent', 'date', 'link'],\n }),\n },\n ['key', 'label'],\n ),\n { minItems: 1, maxItems: 12 },\n ),\n rows: arr(row, { maxItems: 500 }),\n },\n ['columns', 'rows'],\n ),\n fallbackText: (props) => `${heading(props)}${textTable(props.columns ?? [], props.rows ?? [])}`,\n});\n\nexport const Chart = defineComponent<Props>({\n name: 'Chart',\n title: 'Chart',\n description:\n '`bar` to compare categories, `line` for a trend over time. `data` is a list of points; `xKey` names the category/time field and each series names a numeric field.',\n props: obj(\n {\n type: str('Chart type', { enum: ['bar', 'line'] }),\n title: str(),\n xKey: str('Field of each point used for the x axis'),\n series: arr(obj({ key: str('Numeric field'), label: str() }, ['key']), {\n minItems: 1,\n maxItems: 6,\n }),\n data: arr(row, { minItems: 1, maxItems: 200 }),\n unit: str('Unit shown after values, e.g. `KB` or `%`'),\n },\n ['type', 'xKey', 'series', 'data'],\n ),\n fallbackText: (props) => {\n const series: { key: string }[] = props.series ?? [];\n const data: Props[] = props.data ?? [];\n const first = series[0]?.key ?? '';\n const max = Math.max(0, ...data.map((point) => Math.abs(Number(point[first]) || 0)));\n const unit = props.unit ? ` ${s(props.unit)}` : '';\n const lines = data\n .slice(0, 20)\n .map(\n (point) =>\n `${s(point[props.xKey]).slice(0, 18).padEnd(18)} ${bar(Number(point[first]) || 0, max)} ${s(point[first])}${unit}`,\n );\n return `${heading(props)}\\`\\`\\`\\n${lines.join('\\n')}\\n\\`\\`\\``;\n },\n});\n\nexport const KpiCards = defineComponent<Props>({\n name: 'KpiCards',\n title: 'KPI cards',\n description: 'A few key numbers (metrics, totals, counts) as cards.',\n props: obj(\n {\n title: str(),\n items: arr(\n obj(\n {\n label: str(),\n value: { type: ['string', 'number'] },\n delta: str('Change, e.g. `+12%`'),\n trend: str(undefined, { enum: ['up', 'down', 'flat'] }),\n hint: str(),\n },\n ['label', 'value'],\n ),\n { minItems: 1, maxItems: 8 },\n ),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `• *${s(item.label)}:* ${s(item.value)}${item.delta ? ` (${s(item.delta)})` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const SourceCards = defineComponent<Props>({\n name: 'SourceCards',\n title: 'Sources',\n description: 'The documents, pages or links an answer is based on, as cards.',\n props: obj(\n {\n title: str(),\n items: arr(\n obj({ title: str(), url: str(), snippet: str(), source: str('e.g. Wiki, GitHub') }, [\n 'title',\n ]),\n { minItems: 1, maxItems: 12 },\n ),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `• ${item.url ? `<${s(item.url)}|${s(item.title)}>` : s(item.title)}${item.source ? ` — ${s(item.source)}` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const Checklist = defineComponent<Props>({\n name: 'Checklist',\n title: 'Checklist',\n description: 'Steps or a to-do list with done/not-done state.',\n props: obj(\n {\n title: str(),\n items: arr(obj({ label: str(), done: { type: 'boolean' }, note: str() }, ['label']), {\n minItems: 1,\n maxItems: 50,\n }),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `${item.done ? '☑' : '☐'} ${s(item.label)}${item.note ? ` — _${s(item.note)}_` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const Timeline = defineComponent<Props>({\n name: 'Timeline',\n title: 'Timeline',\n description: 'Events in chronological order (the history of a project, an incident, a deal).',\n props: obj(\n {\n title: str(),\n events: arr(obj({ date: str(), title: str(), description: str() }, ['title']), {\n minItems: 1,\n maxItems: 50,\n }),\n },\n ['events'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.events ?? [])\n .map(\n (event: Props) =>\n `• ${event.date ? `*${s(event.date)}* ` : ''}${s(event.title)}${event.description ? ` — ${s(event.description)}` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const CodeBlock = defineComponent<Props>({\n name: 'CodeBlock',\n title: 'Code',\n description: 'A code snippet or file excerpt with syntax highlighting.',\n props: obj({ title: str(), language: str(), code: str() }, ['code']),\n fallbackText: (props) => `${heading(props)}\\`\\`\\`\\n${s(props.code)}\\n\\`\\`\\``,\n});\n\nexport const Diff = defineComponent<Props>({\n name: 'Diff',\n title: 'Diff',\n description: 'A before/after change to a text or code file, as a line diff.',\n props: obj({ title: str(), language: str(), before: str(), after: str() }, ['before', 'after']),\n fallbackText: (props) =>\n `${heading(props)}\\`\\`\\`\\n${lineDiff(s(props.before), s(props.after))\n .map((line) => `${line.op === 'add' ? '+' : line.op === 'del' ? '-' : ' '} ${line.text}`)\n .join('\\n')}\\n\\`\\`\\``,\n});\n\nexport const Callout = defineComponent<Props>({\n name: 'Callout',\n title: 'Callout',\n description: 'A short note, warning or success message, emphasized.',\n props: obj(\n {\n tone: str(undefined, { enum: ['info', 'success', 'warning', 'danger'] }),\n title: str(),\n text: str(),\n },\n ['text'],\n ),\n fallbackText: (props) =>\n `${props.tone === 'warning' || props.tone === 'danger' ? ':warning: ' : ':information_source: '}${heading(props)}${s(props.text)}`,\n});\n\nexport const Stack = defineComponent<Props>({\n name: 'Stack',\n title: 'Stack',\n description: 'Lays its children out vertically (or horizontally with direction=row).',\n props: obj({ direction: str(undefined, { enum: ['column', 'row'] }), gap: { type: 'number' } }),\n children: true,\n fallbackText: () => '',\n});\n\nexport const Card = defineComponent<Props>({\n name: 'Card',\n title: 'Card',\n description: 'A box with an optional title around its children.',\n props: obj({ title: str(), subtitle: str() }),\n children: true,\n fallbackText: (props) =>\n props.title ? `*${s(props.title)}*${props.subtitle ? ` — ${s(props.subtitle)}` : ''}` : '',\n});\n\nexport const Heading = defineComponent<Props>({\n name: 'Heading',\n title: 'Heading',\n description: 'A heading.',\n props: obj({ text: str() }, ['text']),\n fallbackText: (props) => `*${s(props.text)}*`,\n});\n\nexport const Text = defineComponent<Props>({\n name: 'Text',\n title: 'Text',\n description: 'A paragraph of plain text (no markdown).',\n props: obj({ text: str(), muted: { type: 'boolean' } }, ['text']),\n fallbackText: (props) => s(props.text),\n});\n\nexport const Badge = defineComponent<Props>({\n name: 'Badge',\n title: 'Badge',\n description: 'A small label.',\n props: obj(\n {\n text: str(),\n tone: str(undefined, { enum: ['neutral', 'brand', 'success', 'warning', 'danger'] }),\n },\n ['text'],\n ),\n fallbackText: (props) => `[${s(props.text)}]`,\n});\n\nexport const Link = defineComponent<Props>({\n name: 'Link',\n title: 'Link',\n description: 'A link to an http(s) URL.',\n props: obj({ text: str(), url: str(undefined, { pattern: '^https?://' }) }, ['text', 'url']),\n fallbackText: (props) => `<${s(props.url)}|${s(props.text || props.url)}>`,\n});\n\nexport const Image = defineComponent<Props>({\n name: 'Image',\n title: 'Image',\n description: 'An image from an https URL.',\n props: obj({ url: str(undefined, { pattern: '^https://' }), alt: str() }, ['url']),\n fallbackText: (props) => s(props.url),\n});\n\n/** Content components: data a model shows. */\nexport const BUILTIN_COMPONENTS: readonly ComponentDefinition<Props>[] = [\n DataTable,\n Chart,\n KpiCards,\n SourceCards,\n Checklist,\n Timeline,\n CodeBlock,\n Diff,\n Callout,\n];\n\n/** Layout and text primitives, mostly for composing trees (`Stack`, `Card` take children). */\nexport const LAYOUT_COMPONENTS: readonly ComponentDefinition<Props>[] = [\n Stack,\n Card,\n Heading,\n Text,\n Badge,\n Link,\n Image,\n];\n"],"mappings":"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","names":["COMPONENT_NAME","defineComponent","definition","test","name","Error","str","description","extra","type","undefined","obj","properties","required","additionalProperties","arr","items","cell","row","s","value","String","heading","props","title","textTable","columns","rows","max","shown","slice","widths","map","column","Math","min","label","length","r","key","format","values","index","padEnd","join","lines","width","repeat","push","lineDiff","before","after","a","split","b","text","op","dp","Array","from","fill","at","i","j","out","bar","n","round","abs","DataTable","defineComponent","name","align","enum","minItems","maxItems","fallbackText","Chart","xKey","series","data","unit","first","point","Number","KpiCards","delta","trend","hint","item","SourceCards","url","snippet","source","Checklist","done","note","Timeline","events","date","event","CodeBlock","language","code","Diff","line","Callout","tone","Stack","direction","gap","children","Card","subtitle","Heading","Text","muted","Badge","Link","pattern","Image","alt","BUILTIN_COMPONENTS","LAYOUT_COMPONENTS"]}
|
|
1
|
+
{"version":3,"sources":["../../src/genui/catalog.ts","../../src/genui/builtins.ts"],"sourcesContent":["import {\n type GenuiValidation,\n type JsonSchema,\n type JsonSchemaValidator,\n type PropsSchema,\n builtinJsonSchemaValidator,\n toJsonSchema,\n validateProps,\n validatePropsSync,\n} from './schema.js';\n\n/**\n * One component a server may push into a conversation. Data only — how it LOOKS is each app's own\n * renderer, looked up by {@link name}. The same definition serves the model (description + props\n * schema), the server (validation), text-only channels ({@link fallbackText}) and the client\n * (validation before rendering).\n */\nexport interface ComponentDefinition<P = Record<string, unknown>> {\n /** Registry key, e.g. `DataTable`. What a `ui` frame's `component` names. */\n name: string;\n /** Human label: \"Data table\". */\n title: string;\n /** Shown to the model: what the component is for and when to use it. */\n description: string;\n /** The props schema: a Standard Schema (Zod, Valibot, ArkType) or a JSON Schema object. */\n props: PropsSchema;\n /**\n * The component takes nested elements (a layout: `Stack`, `Card`). Only meaningful in tree mode,\n * where a node's `children` are validated against the catalog too.\n */\n children?: boolean;\n /**\n * Plain text / Slack mrkdwn rendering of these props, for a channel that cannot draw the\n * component. Absent → {@link componentToText} prints the props as JSON.\n */\n fallbackText?: (props: P) => string;\n /**\n * Pushed by the server (e.g. an approval card), never offered to the model. Excluded from\n * {@link catalogToModelText} and from the tool factories.\n */\n internal?: boolean;\n /**\n * Schema version of {@link props}. Stamped on every `ui` frame the component is pushed with, so a\n * client can keep rendering messages persisted under an older shape.\n */\n version?: number;\n}\n\n/** Component names: an identifier a registry key, a tool name and a snake_case slug can all be derived from. */\nexport const COMPONENT_NAME = /^[A-Za-z][A-Za-z0-9]{0,63}$/;\n\n/** Declare a component. Validates the name and returns the definition unchanged (typed). */\nexport function defineComponent<P = Record<string, unknown>>(\n definition: ComponentDefinition<P>,\n): ComponentDefinition<P> {\n if (!COMPONENT_NAME.test(definition.name)) {\n throw new Error(\n `genui: component name \"${definition.name}\" must be letters and digits, starting with a letter (e.g. DataTable)`,\n );\n }\n if (\n definition.version !== undefined &&\n (!Number.isSafeInteger(definition.version) || definition.version <= 0)\n )\n throw new RangeError('genui: component version must be a positive safe integer');\n if (definition.fallbackText !== undefined && typeof definition.fallbackText !== 'function')\n throw new TypeError('genui: fallbackText must be a function');\n return definition;\n}\n\nexport interface CatalogOptions {\n /** How JSON Schema props are checked. Default: {@link builtinJsonSchemaValidator}; pass `ajvValidator(new Ajv())` for full JSON Schema. */\n jsonSchemaValidator?: JsonSchemaValidator;\n}\n\n/** An immutable set of component definitions, looked up by name. */\nexport interface Catalog {\n readonly components: readonly ComponentDefinition<any>[];\n readonly validator: JsonSchemaValidator;\n get(name: string): ComponentDefinition<any> | undefined;\n has(name: string): boolean;\n /** The components a model may be offered (every non-`internal` one). */\n modelComponents(): ComponentDefinition<any>[];\n /** Validate `props` for `component`. An unknown component is a validation failure, not a throw. */\n validate(component: string, props: unknown): Promise<GenuiValidation<Record<string, unknown>>>;\n /**\n * {@link validate} without waiting — `undefined` only when the component's Standard Schema\n * validates asynchronously. An unknown component is a failure, as in `validate`.\n */\n validateSync(\n component: string,\n props: unknown,\n ): GenuiValidation<Record<string, unknown>> | undefined;\n /** The component's props as JSON Schema, when it can be derived (see {@link toJsonSchema}). */\n jsonSchemaFor(component: string): JsonSchema | undefined;\n /** A new catalog with these components added (a later definition replaces an earlier one of the same name). */\n extend(components: readonly ComponentDefinition<any>[]): Catalog;\n}\n\n/**\n * Collect component definitions into a {@link Catalog}. Names must be unique; to override a\n * definition (e.g. a builtin), use {@link Catalog.extend}.\n */\nexport function defineCatalog(\n components: readonly ComponentDefinition<any>[],\n options: CatalogOptions = {},\n): Catalog {\n const byName = new Map<string, ComponentDefinition<any>>();\n for (const component of components) {\n defineComponent(component);\n if (byName.has(component.name)) {\n throw new Error(`genui: component \"${component.name}\" is defined twice in one catalog`);\n }\n byName.set(component.name, component);\n }\n return buildCatalog(byName, options.jsonSchemaValidator ?? builtinJsonSchemaValidator);\n}\n\nfunction buildCatalog(\n byName: Map<string, ComponentDefinition<any>>,\n validator: JsonSchemaValidator,\n): Catalog {\n const list = Object.freeze([...byName.values()]);\n return {\n components: list,\n validator,\n get: (name) => byName.get(name),\n has: (name) => byName.has(name),\n modelComponents: () => list.filter((component) => component.internal !== true),\n async validate(component, props) {\n const definition = byName.get(component);\n if (definition === undefined) {\n return {\n ok: false,\n issues: [{ path: [], message: `unknown component \"${component}\"` }],\n };\n }\n const result = await validateProps(definition.props, props, validator);\n return result as GenuiValidation<Record<string, unknown>>;\n },\n validateSync(component, props) {\n const definition = byName.get(component);\n if (definition === undefined) {\n return {\n ok: false,\n issues: [{ path: [], message: `unknown component \"${component}\"` }],\n };\n }\n return validatePropsSync(definition.props, props, validator) as\n | GenuiValidation<Record<string, unknown>>\n | undefined;\n },\n jsonSchemaFor(component) {\n const definition = byName.get(component);\n return definition === undefined ? undefined : toJsonSchema(definition.props);\n },\n extend(more) {\n const next = new Map(byName);\n for (const component of more) {\n defineComponent(component);\n next.set(component.name, component);\n }\n return buildCatalog(next, validator);\n },\n };\n}\n\n/** `DataTable` → `data_table`, `KPICards` → `kpi_cards`. */\nexport function toSnakeCase(name: string): string {\n return name\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .toLowerCase();\n}\n\n/** The per-component tool name: `ui__show_data_table` with the default prefix. */\nexport function toolNameFor(component: string, prefix = 'ui__show_'): string {\n return `${prefix}${toSnakeCase(component)}`;\n}\n","/**\n * Optional builtin component DEFINITIONS — names, props schemas, model descriptions and plain-text\n * fallbacks for the components most chat apps want. No visuals: an app renders each with its own\n * look, keyed by name. Use them as-is, pick some, or extend them:\n *\n * ```ts\n * const catalog = defineCatalog([...BUILTIN_COMPONENTS, ...LAYOUT_COMPONENTS, myDealCard]);\n * ```\n */\nimport { type ComponentDefinition, defineComponent } from './catalog.js';\nimport type { JsonSchema } from './schema.js';\n\ntype Props = Record<string, any>;\n\nconst str = (description?: string, extra: JsonSchema = {}): JsonSchema => ({\n type: 'string',\n ...(description !== undefined ? { description } : {}),\n ...extra,\n});\nconst obj = (properties: Record<string, JsonSchema>, required: string[] = []): JsonSchema => ({\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n});\nconst arr = (items: JsonSchema, extra: JsonSchema = {}): JsonSchema => ({\n type: 'array',\n items,\n ...extra,\n});\nconst cell: JsonSchema = { type: ['string', 'number', 'boolean', 'null'] };\nconst row: JsonSchema = { type: 'object', additionalProperties: cell };\n\nconst s = (value: unknown): string => (value === null || value === undefined ? '' : String(value));\nconst heading = (props: Props): string => (props.title ? `*${s(props.title)}*\\n` : '');\n\n/** A fixed-width text table in a code block, at most `max` rows. */\nexport function textTable(\n columns: readonly { key: string; label: string }[],\n rows: readonly Props[],\n max = 15,\n): string {\n const shown = rows.slice(0, max);\n const widths = columns.map((column) =>\n Math.min(28, Math.max(column.label.length, ...shown.map((r) => s(r[column.key]).length))),\n );\n const format = (values: string[]) =>\n values\n .map((value, index) => value.slice(0, widths[index]).padEnd(widths[index] ?? 0))\n .join(' ');\n const lines = [\n format(columns.map((column) => column.label)),\n widths.map((width) => '-'.repeat(width)).join(' '),\n ...shown.map((r) => format(columns.map((column) => s(r[column.key])))),\n ];\n if (rows.length > max) lines.push(`… ${rows.length - max} more rows`);\n return `\\`\\`\\`\\n${lines.join('\\n')}\\n\\`\\`\\``;\n}\n\nexport interface DiffLine {\n op: 'same' | 'add' | 'del';\n text: string;\n}\n\n/** Line diff (LCS) — good enough for snippets up to a few hundred lines. */\nexport function lineDiff(before: string, after: string): DiffLine[] {\n const a = before.split('\\n');\n const b = after.split('\\n');\n if (a.length * b.length > 250_000) {\n return [\n ...a.map((text) => ({ op: 'del' as const, text })),\n ...b.map((text) => ({ op: 'add' as const, text })),\n ];\n }\n const dp: number[][] = Array.from({ length: a.length + 1 }, () =>\n new Array<number>(b.length + 1).fill(0),\n );\n const at = (i: number, j: number): number => dp[i]?.[j] ?? 0;\n for (let i = a.length - 1; i >= 0; i--) {\n for (let j = b.length - 1; j >= 0; j--) {\n (dp[i] as number[])[j] =\n a[i] === b[j] ? at(i + 1, j + 1) + 1 : Math.max(at(i + 1, j), at(i, j + 1));\n }\n }\n const out: DiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < a.length && j < b.length) {\n if (a[i] === b[j]) {\n out.push({ op: 'same', text: a[i] as string });\n i++;\n j++;\n } else if (at(i + 1, j) >= at(i, j + 1)) {\n out.push({ op: 'del', text: a[i++] as string });\n } else {\n out.push({ op: 'add', text: b[j++] as string });\n }\n }\n while (i < a.length) out.push({ op: 'del', text: a[i++] as string });\n while (j < b.length) out.push({ op: 'add', text: b[j++] as string });\n return out;\n}\n\nfunction bar(value: number, max: number, width = 20): string {\n const n = max > 0 ? Math.round((Math.abs(value) / max) * width) : 0;\n return '█'.repeat(n) || '▏';\n}\n\nexport const DataTable = defineComponent<Props>({\n name: 'DataTable',\n title: 'Data table',\n description:\n 'Tabular data (records with the same fields) as a sortable table. Prefer it over markdown tables for more than 3 rows.',\n props: obj(\n {\n title: str('Short caption'),\n columns: arr(\n obj(\n {\n key: str('Field name in each row'),\n label: str('Column header'),\n align: str(undefined, { enum: ['left', 'right', 'center'] }),\n format: str('How to format values', {\n enum: ['text', 'number', 'currency', 'percent', 'date', 'link'],\n }),\n },\n ['key', 'label'],\n ),\n { minItems: 1, maxItems: 12 },\n ),\n rows: arr(row, { maxItems: 500 }),\n },\n ['columns', 'rows'],\n ),\n fallbackText: (props) => `${heading(props)}${textTable(props.columns ?? [], props.rows ?? [])}`,\n});\n\nexport const Chart = defineComponent<Props>({\n name: 'Chart',\n title: 'Chart',\n description:\n '`bar` to compare categories, `line` for a trend over time. `data` is a list of points; `xKey` names the category/time field and each series names a numeric field.',\n props: obj(\n {\n type: str('Chart type', { enum: ['bar', 'line'] }),\n title: str(),\n xKey: str('Field of each point used for the x axis'),\n series: arr(obj({ key: str('Numeric field'), label: str() }, ['key']), {\n minItems: 1,\n maxItems: 6,\n }),\n data: arr(row, { minItems: 1, maxItems: 200 }),\n unit: str('Unit shown after values, e.g. `KB` or `%`'),\n },\n ['type', 'xKey', 'series', 'data'],\n ),\n fallbackText: (props) => {\n const series: { key: string }[] = props.series ?? [];\n const data: Props[] = props.data ?? [];\n const first = series[0]?.key ?? '';\n const max = Math.max(0, ...data.map((point) => Math.abs(Number(point[first]) || 0)));\n const unit = props.unit ? ` ${s(props.unit)}` : '';\n const lines = data\n .slice(0, 20)\n .map(\n (point) =>\n `${s(point[props.xKey]).slice(0, 18).padEnd(18)} ${bar(Number(point[first]) || 0, max)} ${s(point[first])}${unit}`,\n );\n return `${heading(props)}\\`\\`\\`\\n${lines.join('\\n')}\\n\\`\\`\\``;\n },\n});\n\nexport const KpiCards = defineComponent<Props>({\n name: 'KpiCards',\n title: 'KPI cards',\n description: 'A few key numbers (metrics, totals, counts) as cards.',\n props: obj(\n {\n title: str(),\n items: arr(\n obj(\n {\n label: str(),\n value: { type: ['string', 'number'] },\n delta: str('Change, e.g. `+12%`'),\n trend: str(undefined, { enum: ['up', 'down', 'flat'] }),\n hint: str(),\n },\n ['label', 'value'],\n ),\n { minItems: 1, maxItems: 8 },\n ),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `• *${s(item.label)}:* ${s(item.value)}${item.delta ? ` (${s(item.delta)})` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const SourceCards = defineComponent<Props>({\n name: 'SourceCards',\n title: 'Sources',\n description: 'The documents, pages or links an answer is based on, as cards.',\n props: obj(\n {\n title: str(),\n items: arr(\n obj({ title: str(), url: str(), snippet: str(), source: str('e.g. Wiki, GitHub') }, [\n 'title',\n ]),\n { minItems: 1, maxItems: 12 },\n ),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `• ${item.url ? `<${s(item.url)}|${s(item.title)}>` : s(item.title)}${item.source ? ` — ${s(item.source)}` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const Checklist = defineComponent<Props>({\n name: 'Checklist',\n title: 'Checklist',\n description: 'Steps or a to-do list with done/not-done state.',\n props: obj(\n {\n title: str(),\n items: arr(obj({ label: str(), done: { type: 'boolean' }, note: str() }, ['label']), {\n minItems: 1,\n maxItems: 50,\n }),\n },\n ['items'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.items ?? [])\n .map(\n (item: Props) =>\n `${item.done ? '☑' : '☐'} ${s(item.label)}${item.note ? ` — _${s(item.note)}_` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const Timeline = defineComponent<Props>({\n name: 'Timeline',\n title: 'Timeline',\n description: 'Events in chronological order (the history of a project, an incident, a deal).',\n props: obj(\n {\n title: str(),\n events: arr(obj({ date: str(), title: str(), description: str() }, ['title']), {\n minItems: 1,\n maxItems: 50,\n }),\n },\n ['events'],\n ),\n fallbackText: (props) =>\n `${heading(props)}${(props.events ?? [])\n .map(\n (event: Props) =>\n `• ${event.date ? `*${s(event.date)}* ` : ''}${s(event.title)}${event.description ? ` — ${s(event.description)}` : ''}`,\n )\n .join('\\n')}`,\n});\n\nexport const CodeBlock = defineComponent<Props>({\n name: 'CodeBlock',\n title: 'Code',\n description: 'A code snippet or file excerpt with syntax highlighting.',\n props: obj({ title: str(), language: str(), code: str() }, ['code']),\n fallbackText: (props) => `${heading(props)}\\`\\`\\`\\n${s(props.code)}\\n\\`\\`\\``,\n});\n\nexport const Diff = defineComponent<Props>({\n name: 'Diff',\n title: 'Diff',\n description: 'A before/after change to a text or code file, as a line diff.',\n props: obj({ title: str(), language: str(), before: str(), after: str() }, ['before', 'after']),\n fallbackText: (props) =>\n `${heading(props)}\\`\\`\\`\\n${lineDiff(s(props.before), s(props.after))\n .map((line) => `${line.op === 'add' ? '+' : line.op === 'del' ? '-' : ' '} ${line.text}`)\n .join('\\n')}\\n\\`\\`\\``,\n});\n\nexport const Callout = defineComponent<Props>({\n name: 'Callout',\n title: 'Callout',\n description: 'A short note, warning or success message, emphasized.',\n props: obj(\n {\n tone: str(undefined, { enum: ['info', 'success', 'warning', 'danger'] }),\n title: str(),\n text: str(),\n },\n ['text'],\n ),\n fallbackText: (props) =>\n `${props.tone === 'warning' || props.tone === 'danger' ? ':warning: ' : ':information_source: '}${heading(props)}${s(props.text)}`,\n});\n\nexport const Stack = defineComponent<Props>({\n name: 'Stack',\n title: 'Stack',\n description: 'Lays its children out vertically (or horizontally with direction=row).',\n props: obj({ direction: str(undefined, { enum: ['column', 'row'] }), gap: { type: 'number' } }),\n children: true,\n fallbackText: () => '',\n});\n\nexport const Card = defineComponent<Props>({\n name: 'Card',\n title: 'Card',\n description: 'A box with an optional title around its children.',\n props: obj({ title: str(), subtitle: str() }),\n children: true,\n fallbackText: (props) =>\n props.title ? `*${s(props.title)}*${props.subtitle ? ` — ${s(props.subtitle)}` : ''}` : '',\n});\n\nexport const Heading = defineComponent<Props>({\n name: 'Heading',\n title: 'Heading',\n description: 'A heading.',\n props: obj({ text: str() }, ['text']),\n fallbackText: (props) => `*${s(props.text)}*`,\n});\n\nexport const Text = defineComponent<Props>({\n name: 'Text',\n title: 'Text',\n description: 'A paragraph of plain text (no markdown).',\n props: obj({ text: str(), muted: { type: 'boolean' } }, ['text']),\n fallbackText: (props) => s(props.text),\n});\n\nexport const Badge = defineComponent<Props>({\n name: 'Badge',\n title: 'Badge',\n description: 'A small label.',\n props: obj(\n {\n text: str(),\n tone: str(undefined, { enum: ['neutral', 'brand', 'success', 'warning', 'danger'] }),\n },\n ['text'],\n ),\n fallbackText: (props) => `[${s(props.text)}]`,\n});\n\nexport const Link = defineComponent<Props>({\n name: 'Link',\n title: 'Link',\n description: 'A link to an http(s) URL.',\n props: obj({ text: str(), url: str(undefined, { pattern: '^https?://' }) }, ['text', 'url']),\n fallbackText: (props) => `<${s(props.url)}|${s(props.text || props.url)}>`,\n});\n\nexport const Image = defineComponent<Props>({\n name: 'Image',\n title: 'Image',\n description: 'An image from an https URL.',\n props: obj({ url: str(undefined, { pattern: '^https://' }), alt: str() }, ['url']),\n fallbackText: (props) => s(props.url),\n});\n\n/** Content components: data a model shows. */\nexport const BUILTIN_COMPONENTS: readonly ComponentDefinition<Props>[] = [\n DataTable,\n Chart,\n KpiCards,\n SourceCards,\n Checklist,\n Timeline,\n CodeBlock,\n Diff,\n Callout,\n];\n\n/** Layout and text primitives, mostly for composing trees (`Stack`, `Card` take children). */\nexport const LAYOUT_COMPONENTS: readonly ComponentDefinition<Props>[] = [\n Stack,\n Card,\n Heading,\n Text,\n Badge,\n Link,\n Image,\n];\n"],"mappings":"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","names":["COMPONENT_NAME","defineComponent","definition","test","name","Error","version","undefined","Number","isSafeInteger","RangeError","fallbackText","TypeError","str","description","extra","type","undefined","obj","properties","required","additionalProperties","arr","items","cell","row","s","value","String","heading","props","title","textTable","columns","rows","max","shown","slice","widths","map","column","Math","min","label","length","r","key","format","values","index","padEnd","join","lines","width","repeat","push","lineDiff","before","after","a","split","b","text","op","dp","Array","from","fill","at","i","j","out","bar","n","round","abs","DataTable","defineComponent","name","align","enum","minItems","maxItems","fallbackText","Chart","xKey","series","data","unit","first","point","Number","KpiCards","delta","trend","hint","item","SourceCards","url","snippet","source","Checklist","done","note","Timeline","events","date","event","CodeBlock","language","code","Diff","line","Callout","tone","Stack","direction","gap","children","Card","subtitle","Heading","Text","muted","Badge","Link","pattern","Image","alt","BUILTIN_COMPONENTS","LAYOUT_COMPONENTS"]}
|
package/dist/genui/index.cjs
CHANGED
|
@@ -36,6 +36,8 @@ __export(genui_exports, {
|
|
|
36
36
|
getPath: () => getPath,
|
|
37
37
|
isStandardSchema: () => isStandardSchema,
|
|
38
38
|
jsonStandardSchema: () => jsonStandardSchema,
|
|
39
|
+
negotiateCatalog: () => negotiateCatalog,
|
|
40
|
+
prepareUiEmission: () => prepareUiEmission,
|
|
39
41
|
showToolJsonSchema: () => showToolJsonSchema,
|
|
40
42
|
summarizeSchema: () => summarizeSchema,
|
|
41
43
|
toJsonSchema: () => toJsonSchema,
|
|
@@ -46,7 +48,8 @@ __export(genui_exports, {
|
|
|
46
48
|
treeToText: () => treeToText,
|
|
47
49
|
validateProps: () => validateProps,
|
|
48
50
|
validatePropsSync: () => validatePropsSync,
|
|
49
|
-
validateTree: () => validateTree
|
|
51
|
+
validateTree: () => validateTree,
|
|
52
|
+
validateUiCapabilities: () => validateUiCapabilities
|
|
50
53
|
});
|
|
51
54
|
module.exports = __toCommonJS(genui_exports);
|
|
52
55
|
|
|
@@ -327,11 +330,11 @@ function check(schema, value, path, root, issues, depth) {
|
|
|
327
330
|
}
|
|
328
331
|
}
|
|
329
332
|
if (matchesType("object", value)) {
|
|
330
|
-
const
|
|
333
|
+
const record2 = value;
|
|
331
334
|
const properties = typeof s.properties === "object" && s.properties !== null ? s.properties : {};
|
|
332
335
|
if (Array.isArray(s.required)) {
|
|
333
336
|
for (const key of s.required) {
|
|
334
|
-
if (
|
|
337
|
+
if (record2[key] === void 0) {
|
|
335
338
|
issues.push({
|
|
336
339
|
path: [
|
|
337
340
|
...path,
|
|
@@ -342,7 +345,7 @@ function check(schema, value, path, root, issues, depth) {
|
|
|
342
345
|
}
|
|
343
346
|
}
|
|
344
347
|
}
|
|
345
|
-
for (const [key, entry] of Object.entries(
|
|
348
|
+
for (const [key, entry] of Object.entries(record2)) {
|
|
346
349
|
if (key in properties) {
|
|
347
350
|
if (entry !== void 0) {
|
|
348
351
|
check(properties[key], entry, [
|
|
@@ -402,6 +405,8 @@ function defineComponent(definition) {
|
|
|
402
405
|
if (!COMPONENT_NAME.test(definition.name)) {
|
|
403
406
|
throw new Error(`genui: component name "${definition.name}" must be letters and digits, starting with a letter (e.g. DataTable)`);
|
|
404
407
|
}
|
|
408
|
+
if (definition.version !== void 0 && (!Number.isSafeInteger(definition.version) || definition.version <= 0)) throw new RangeError("genui: component version must be a positive safe integer");
|
|
409
|
+
if (definition.fallbackText !== void 0 && typeof definition.fallbackText !== "function") throw new TypeError("genui: fallbackText must be a function");
|
|
405
410
|
return definition;
|
|
406
411
|
}
|
|
407
412
|
__name(defineComponent, "defineComponent");
|
|
@@ -710,7 +715,8 @@ function componentToText(catalog, component, props) {
|
|
|
710
715
|
const fallback = catalog.get(component)?.fallbackText;
|
|
711
716
|
if (fallback !== void 0) {
|
|
712
717
|
try {
|
|
713
|
-
|
|
718
|
+
const text = fallback(props);
|
|
719
|
+
if (typeof text === "string" && text.trim().length > 0) return text;
|
|
714
720
|
} catch {
|
|
715
721
|
}
|
|
716
722
|
}
|
|
@@ -724,7 +730,8 @@ function treeToText(catalog, root) {
|
|
|
724
730
|
const definition = catalog.get(node.type);
|
|
725
731
|
if (definition?.fallbackText !== void 0) {
|
|
726
732
|
try {
|
|
727
|
-
|
|
733
|
+
const text = definition.fallbackText(node.props);
|
|
734
|
+
out.push(typeof text === "string" && text.trim().length > 0 ? text : jsonBlock(node.props));
|
|
728
735
|
} catch {
|
|
729
736
|
out.push(jsonBlock(node.props));
|
|
730
737
|
}
|
|
@@ -741,7 +748,7 @@ function jsonBlock(props) {
|
|
|
741
748
|
const title = typeof props.title === "string" && props.title.length > 0 ? `*${props.title}*
|
|
742
749
|
` : "";
|
|
743
750
|
return `${title}\`\`\`
|
|
744
|
-
${JSON.stringify(props, null, 2)
|
|
751
|
+
${JSON.stringify(props, null, 2)}
|
|
745
752
|
\`\`\``;
|
|
746
753
|
}
|
|
747
754
|
__name(jsonBlock, "jsonBlock");
|
|
@@ -832,6 +839,81 @@ function getPath(source, path) {
|
|
|
832
839
|
}
|
|
833
840
|
__name(getPath, "getPath");
|
|
834
841
|
|
|
842
|
+
// src/genui/capabilities.ts
|
|
843
|
+
function validateUiCapabilities(value) {
|
|
844
|
+
if (!record(value) || Object.keys(value).some((key) => key !== "components") || !Array.isArray(value.components)) throw new TypeError("Invalid UI capabilities");
|
|
845
|
+
const seen = /* @__PURE__ */ new Set();
|
|
846
|
+
const components = value.components.map((component) => {
|
|
847
|
+
if (!record(component) || Object.keys(component).some((key) => key !== "name" && key !== "version") || typeof component.name !== "string" || !COMPONENT_NAME.test(component.name) || !Number.isSafeInteger(component.version) || Number(component.version) <= 0 || seen.has(component.name)) throw new TypeError("Invalid UI component capability");
|
|
848
|
+
seen.add(component.name);
|
|
849
|
+
return {
|
|
850
|
+
name: component.name,
|
|
851
|
+
version: Number(component.version)
|
|
852
|
+
};
|
|
853
|
+
});
|
|
854
|
+
return {
|
|
855
|
+
components
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
__name(validateUiCapabilities, "validateUiCapabilities");
|
|
859
|
+
function record(value) {
|
|
860
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
861
|
+
}
|
|
862
|
+
__name(record, "record");
|
|
863
|
+
function negotiateCatalog(catalog, capabilities) {
|
|
864
|
+
if (capabilities === void 0) return catalog;
|
|
865
|
+
const supported = validateUiCapabilities(capabilities).components;
|
|
866
|
+
return defineCatalog(catalog.components.filter((component) => supported.some((entry) => entry.name === component.name && entry.version === (component.version ?? 1))), {
|
|
867
|
+
jsonSchemaValidator: catalog.validator
|
|
868
|
+
});
|
|
869
|
+
}
|
|
870
|
+
__name(negotiateCatalog, "negotiateCatalog");
|
|
871
|
+
async function prepareUiEmission(catalog, capabilities, component, props, version) {
|
|
872
|
+
const drawable = negotiateCatalog(catalog, capabilities);
|
|
873
|
+
if (component === GENUI_TREE_COMPONENT) {
|
|
874
|
+
if (version !== void 0 && version !== 1) throw new Error("Invalid UI tree version");
|
|
875
|
+
const validated2 = await validateTree(catalog, props.root);
|
|
876
|
+
if (!validated2.ok) throw new Error(`Invalid UI tree: ${formatIssues(validated2.issues)}`);
|
|
877
|
+
const supported = /* @__PURE__ */ __name((node) => drawable.has(node.type) && (node.children ?? []).every(supported), "supported");
|
|
878
|
+
const versions = /* @__PURE__ */ new Map();
|
|
879
|
+
const collectVersions = /* @__PURE__ */ __name((node) => {
|
|
880
|
+
versions.set(node.type, catalog.get(node.type)?.version ?? 1);
|
|
881
|
+
for (const child of node.children ?? []) collectVersions(child);
|
|
882
|
+
}, "collectVersions");
|
|
883
|
+
collectVersions(validated2.value);
|
|
884
|
+
return supported(validated2.value) ? {
|
|
885
|
+
kind: "ui",
|
|
886
|
+
component,
|
|
887
|
+
props: {
|
|
888
|
+
root: validated2.value
|
|
889
|
+
},
|
|
890
|
+
version: 1,
|
|
891
|
+
fallbackText: treeToText(catalog, validated2.value),
|
|
892
|
+
componentVersions: Object.fromEntries(versions)
|
|
893
|
+
} : {
|
|
894
|
+
kind: "text",
|
|
895
|
+
text: treeToText(catalog, validated2.value)
|
|
896
|
+
};
|
|
897
|
+
}
|
|
898
|
+
const definition = catalog.get(component);
|
|
899
|
+
if (definition === void 0) throw new Error(`Unknown UI component "${component}"`);
|
|
900
|
+
const currentVersion = definition.version ?? 1;
|
|
901
|
+
if (version !== void 0 && version !== currentVersion) throw new Error(`Invalid UI component version for "${component}"`);
|
|
902
|
+
const validated = await catalog.validate(component, props);
|
|
903
|
+
if (!validated.ok) throw new Error(`Invalid UI props: ${formatIssues(validated.issues)}`);
|
|
904
|
+
return drawable.has(component) ? {
|
|
905
|
+
kind: "ui",
|
|
906
|
+
component,
|
|
907
|
+
props: validated.value,
|
|
908
|
+
version: currentVersion,
|
|
909
|
+
fallbackText: componentToText(catalog, component, validated.value)
|
|
910
|
+
} : {
|
|
911
|
+
kind: "text",
|
|
912
|
+
text: componentToText(catalog, component, validated.value)
|
|
913
|
+
};
|
|
914
|
+
}
|
|
915
|
+
__name(prepareUiEmission, "prepareUiEmission");
|
|
916
|
+
|
|
835
917
|
// src/genui/tools.ts
|
|
836
918
|
var GENUI_SHOW_TOOL = "ui__show";
|
|
837
919
|
function genuiTools(catalog, options = {}) {
|
|
@@ -902,23 +984,22 @@ function componentTool(catalog, component, options) {
|
|
|
902
984
|
return push(ctx, component.name, validated.value, definition.version);
|
|
903
985
|
}
|
|
904
986
|
};
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
if (definition === void 0) {
|
|
910
|
-
return {
|
|
911
|
-
description: `Not available in this conversation \u2014 do not call this tool. (${component.name})`
|
|
912
|
-
};
|
|
913
|
-
}
|
|
987
|
+
handler.describe = async (scope) => {
|
|
988
|
+
const resolved = negotiateCatalog(await catalogFor(catalog, options, scopeOf(scope)), scope.uiCapabilities);
|
|
989
|
+
const definition = modelComponent(resolved, component.name);
|
|
990
|
+
if (definition === void 0) {
|
|
914
991
|
return {
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
type: "object"
|
|
918
|
-
})
|
|
992
|
+
available: false,
|
|
993
|
+
description: `Not available in this conversation \u2014 do not call this tool. (${component.name})`
|
|
919
994
|
};
|
|
995
|
+
}
|
|
996
|
+
return {
|
|
997
|
+
description: describeFor(definition),
|
|
998
|
+
inputSchema: permissiveSchema(toJsonSchema(definition.props) ?? {
|
|
999
|
+
type: "object"
|
|
1000
|
+
})
|
|
920
1001
|
};
|
|
921
|
-
}
|
|
1002
|
+
};
|
|
922
1003
|
return {
|
|
923
1004
|
spec: {
|
|
924
1005
|
name: toolNameFor(component.name, options.namePrefix),
|
|
@@ -962,15 +1043,14 @@ function treeTool(catalog, options) {
|
|
|
962
1043
|
});
|
|
963
1044
|
}
|
|
964
1045
|
};
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
};
|
|
1046
|
+
handler.describe = async (scope) => {
|
|
1047
|
+
const resolved = negotiateCatalog(await catalogFor(catalog, options, scopeOf(scope)), scope.uiCapabilities);
|
|
1048
|
+
return {
|
|
1049
|
+
available: resolved.modelComponents().length > 0,
|
|
1050
|
+
description: describeFor(resolved),
|
|
1051
|
+
inputSchema: permissiveSchema(treeJsonSchema(resolved))
|
|
972
1052
|
};
|
|
973
|
-
}
|
|
1053
|
+
};
|
|
974
1054
|
return {
|
|
975
1055
|
spec: {
|
|
976
1056
|
name,
|
|
@@ -1100,15 +1180,14 @@ function showTool(catalog, options) {
|
|
|
1100
1180
|
return push(ctx, result.definition.name, result.props, result.definition.version);
|
|
1101
1181
|
}
|
|
1102
1182
|
};
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
};
|
|
1183
|
+
handler.describe = async (scope) => {
|
|
1184
|
+
const resolved = negotiateCatalog(await catalogFor(catalog, options, scopeOf(scope)), scope.uiCapabilities);
|
|
1185
|
+
return {
|
|
1186
|
+
available: resolved.modelComponents().length > 0,
|
|
1187
|
+
description: describeFor(resolved),
|
|
1188
|
+
inputSchema: permissiveSchema(showToolJsonSchema(resolved))
|
|
1110
1189
|
};
|
|
1111
|
-
}
|
|
1190
|
+
};
|
|
1112
1191
|
return {
|
|
1113
1192
|
spec: {
|
|
1114
1193
|
name,
|
|
@@ -1210,6 +1289,8 @@ __name(asyncJsonStandardSchema, "asyncJsonStandardSchema");
|
|
|
1210
1289
|
getPath,
|
|
1211
1290
|
isStandardSchema,
|
|
1212
1291
|
jsonStandardSchema,
|
|
1292
|
+
negotiateCatalog,
|
|
1293
|
+
prepareUiEmission,
|
|
1213
1294
|
showToolJsonSchema,
|
|
1214
1295
|
summarizeSchema,
|
|
1215
1296
|
toJsonSchema,
|
|
@@ -1220,6 +1301,7 @@ __name(asyncJsonStandardSchema, "asyncJsonStandardSchema");
|
|
|
1220
1301
|
treeToText,
|
|
1221
1302
|
validateProps,
|
|
1222
1303
|
validatePropsSync,
|
|
1223
|
-
validateTree
|
|
1304
|
+
validateTree,
|
|
1305
|
+
validateUiCapabilities
|
|
1224
1306
|
});
|
|
1225
1307
|
//# sourceMappingURL=index.cjs.map
|