@openuidev/a2ui 0.3.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/LICENSE +21 -0
- package/README.md +97 -0
- package/dist/client-D0JsJgUP.d.cts +399 -0
- package/dist/client-D0JsJgUP.d.cts.map +1 -0
- package/dist/client-QtfEE14J.d.mts +399 -0
- package/dist/client-QtfEE14J.d.mts.map +1 -0
- package/dist/index.cjs +795 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +18 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +767 -0
- package/dist/index.mjs.map +1 -0
- package/dist/json-pointer-CA9LEWAP.cjs +117 -0
- package/dist/json-pointer-CA9LEWAP.cjs.map +1 -0
- package/dist/json-pointer-DCdSrMT3.mjs +94 -0
- package/dist/json-pointer-DCdSrMT3.mjs.map +1 -0
- package/dist/react.cjs +95 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +42 -0
- package/dist/react.d.cts.map +1 -0
- package/dist/react.d.mts +42 -0
- package/dist/react.d.mts.map +1 -0
- package/dist/react.mjs +94 -0
- package/dist/react.mjs.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["#parser","#functions","#onMessage","#rendererCapabilities","#now","#createId","#surfaces","#surfaceListeners","#messageListeners","#pendingAgentFunctions","#invalidMessage","#createSurface","#updateComponents","#updateDataModel","#deleteSurface","#callRendererFunction","#agentFunctionResponse","#replaceSurface","#emitGenericError","#emit","#mergeComponents","#emitValidationError","#requireSurface","#notify","#revision"],"sources":["../src/protocol-schema.ts","../src/runtime-schema.ts","../src/statement-patch.ts","../src/client.ts"],"sourcesContent":["import { z } from \"zod/v4\";\n\nexport const jsonValueSchema = z.json();\nexport const jsonObjectSchema = z.record(z.string(), jsonValueSchema);\n\nconst versionSchema = z.literal(\"v1.0\");\nconst surfaceIdSchema = z.string();\nconst extensionKeySchema = z.string().regex(/^[\\p{XID_Start}_][\\p{XID_Continue}]*$/u);\nconst extensionsSchema = z.record(extensionKeySchema, jsonValueSchema);\nexport const messageMetadataSchema = z.strictObject({ extensions: extensionsSchema.optional() });\nconst langComponentsSchema = z\n .array(z.string().min(1))\n .min(1)\n .describe(\n \"Complete OpenUI Lang statements or statement blocks, merged by statement ID in array order.\",\n );\n\nexport const a2uiFunctionCallSchema = z.strictObject({\n call: z.string(),\n catalogId: z.string().optional(),\n args: jsonObjectSchema.optional(),\n});\n\nexport const a2uiFunctionResponseSchema = z.union([\n z.strictObject({ functionCallId: z.string(), value: jsonValueSchema }),\n z.strictObject({\n functionCallId: z.string(),\n error: z.strictObject({ code: z.string(), message: z.string() }),\n }),\n]);\n\nexport const createSurfaceMessageSchema = z.strictObject({\n version: versionSchema,\n createSurface: z.strictObject({\n surfaceId: surfaceIdSchema,\n catalogId: z.string().optional(),\n sendDataModel: z.boolean().optional().meta({ default: false }),\n components: langComponentsSchema\n .optional()\n .describe(\"Optional initial OpenUI Lang statements for single-message surface creation.\"),\n dataModel: jsonObjectSchema.optional(),\n metadata: messageMetadataSchema.optional(),\n }),\n});\n\nexport const updateComponentsMessageSchema = z.strictObject({\n version: versionSchema,\n updateComponents: z.strictObject({\n surfaceId: surfaceIdSchema,\n components: langComponentsSchema,\n }),\n});\n\nexport const updateDataModelMessageSchema = z.strictObject({\n version: versionSchema,\n updateDataModel: z.strictObject({\n surfaceId: surfaceIdSchema,\n path: z.string().optional(),\n value: jsonValueSchema,\n }),\n});\n\nexport const deleteSurfaceMessageSchema = z.strictObject({\n version: versionSchema,\n deleteSurface: z.strictObject({ surfaceId: surfaceIdSchema }),\n});\n\nexport const callRendererFunctionMessageSchema = z.strictObject({\n version: versionSchema,\n callRendererFunction: z.strictObject({\n functionCallId: z.string(),\n callFunction: a2uiFunctionCallSchema.extend({ catalogId: z.string() }),\n }),\n});\n\nexport const agentFunctionResponseMessageSchema = z.strictObject({\n version: versionSchema,\n agentFunctionResponse: a2uiFunctionResponseSchema,\n});\n\nexport const agentToRendererMessageSchema = z.union([\n createSurfaceMessageSchema,\n updateComponentsMessageSchema,\n updateDataModelMessageSchema,\n deleteSurfaceMessageSchema,\n callRendererFunctionMessageSchema,\n agentFunctionResponseMessageSchema,\n]);\n\nexport const actionMessageSchema = z.strictObject({\n version: versionSchema,\n action: z.strictObject({\n name: z.string(),\n userMessage: z.string().optional(),\n surfaceId: surfaceIdSchema,\n sourceComponentId: z.string(),\n timestamp: z.iso.datetime({ offset: true }),\n context: jsonObjectSchema,\n metadata: messageMetadataSchema.optional(),\n }),\n});\n\nexport const callAgentFunctionMessageSchema = z.strictObject({\n version: versionSchema,\n callAgentFunction: z.strictObject({\n surfaceId: surfaceIdSchema,\n functionCallId: z.string(),\n callFunction: a2uiFunctionCallSchema,\n }),\n});\n\nexport const rendererFunctionResponseMessageSchema = z.strictObject({\n version: versionSchema,\n rendererFunctionResponse: a2uiFunctionResponseSchema,\n});\n\nconst validationErrorCodeSchema = z.enum([\n \"VALIDATION_FAILED\",\n \"UNALLOWED_PARENT\",\n \"UNALLOWED_CHILD\",\n]);\n\nexport const validationFailedErrorMessageSchema = z.strictObject({\n version: versionSchema,\n error: z.strictObject({\n code: validationErrorCodeSchema,\n surfaceId: surfaceIdSchema,\n path: z.string(),\n message: z.string(),\n }),\n});\n\nconst genericErrorCodeSchema = z\n .string()\n .refine((code) => !validationErrorCodeSchema.options.includes(code as never));\n\nexport const genericErrorMessageSchema = z.union([\n z.strictObject({\n version: versionSchema,\n error: z.strictObject({\n code: genericErrorCodeSchema,\n message: z.string(),\n surfaceId: surfaceIdSchema,\n }),\n }),\n z.strictObject({\n version: versionSchema,\n error: z.strictObject({\n code: genericErrorCodeSchema,\n message: z.string(),\n functionCallId: z.string(),\n }),\n }),\n]);\n\nexport const rendererToAgentMessageSchema = z.union([\n actionMessageSchema,\n callAgentFunctionMessageSchema,\n rendererFunctionResponseMessageSchema,\n validationFailedErrorMessageSchema,\n genericErrorMessageSchema,\n]);\n\nexport const rendererCapabilitiesSchema = z.strictObject({\n \"v1.0\": z.strictObject({\n supportedCatalogIds: z.array(z.string()),\n inlineCatalogs: z.array(jsonObjectSchema).optional(),\n }),\n});\n\nexport const agentCapabilitiesSchema = z.strictObject({\n \"v1.0\": z.strictObject({\n supportedCatalogIds: z.array(z.string()).optional(),\n acceptsInlineCatalogs: z.boolean().optional().meta({ default: false }),\n }),\n});\n\nexport const rendererDataModelSchema = z.strictObject({\n version: versionSchema,\n surfaces: z.record(z.string(), jsonObjectSchema),\n});\n","import {\n agentFunctionResponseMessageSchema,\n agentToRendererMessageSchema,\n callRendererFunctionMessageSchema,\n createSurfaceMessageSchema,\n deleteSurfaceMessageSchema,\n updateComponentsMessageSchema,\n updateDataModelMessageSchema,\n} from \"./protocol-schema\";\nimport type { AgentToRendererMessage, ProtocolValidationIssue } from \"./types\";\n\nfunction escapePointerToken(token: PropertyKey): string {\n return String(token).replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\n}\n\nfunction issuePath(path: PropertyKey[]): string {\n return path.length === 0 ? \"/\" : `/${path.map(escapePointerToken).join(\"/\")}`;\n}\n\nexport function validateAgentToRendererMessage(\n input: unknown,\n):\n | { success: true; message: AgentToRendererMessage }\n | { success: false; issues: ProtocolValidationIssue[] } {\n const object =\n input != null && typeof input === \"object\" && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : undefined;\n const messageKeys = [\n \"createSurface\",\n \"updateComponents\",\n \"updateDataModel\",\n \"deleteSurface\",\n \"callRendererFunction\",\n \"agentFunctionResponse\",\n ] as const;\n const presentKeys = object\n ? messageKeys.filter((key) => Object.prototype.hasOwnProperty.call(object, key))\n : [];\n const selectedSchema =\n presentKeys.length === 1\n ? {\n createSurface: createSurfaceMessageSchema,\n updateComponents: updateComponentsMessageSchema,\n updateDataModel: updateDataModelMessageSchema,\n deleteSurface: deleteSurfaceMessageSchema,\n callRendererFunction: callRendererFunctionMessageSchema,\n agentFunctionResponse: agentFunctionResponseMessageSchema,\n }[presentKeys[0]!]\n : agentToRendererMessageSchema;\n const result = selectedSchema.safeParse(input);\n if (result.success) {\n return { success: true, message: result.data as AgentToRendererMessage };\n }\n return {\n success: false,\n issues: result.error.issues.map((issue) => ({\n path: issuePath(issue.path),\n message: issue.message,\n })),\n };\n}\n","const STATEMENT_PATTERN = /^(\\$?[A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*([\\s\\S]*)$/u;\n\nfunction stripFences(source: string): string {\n const trimmed = source.trim();\n if (!trimmed.startsWith(\"```\")) return trimmed;\n\n const firstLineEnd = trimmed.indexOf(\"\\n\");\n const lastFence = trimmed.lastIndexOf(\"```\");\n if (firstLineEnd === -1 || lastFence <= firstLineEnd) return trimmed;\n return trimmed.slice(firstLineEnd + 1, lastFence).trim();\n}\n\nfunction splitStatements(source: string): string[] {\n const statements: string[] = [];\n let depth = 0;\n let ternaryDepth = 0;\n let quote: false | '\"' | \"'\" = false;\n let escaped = false;\n let start = 0;\n\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (character === \"\\\\\" && quote) {\n escaped = true;\n continue;\n }\n if (quote) {\n if (character === quote) quote = false;\n continue;\n }\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n if (character === \"(\" || character === \"[\" || character === \"{\") depth += 1;\n else if (character === \")\" || character === \"]\" || character === \"}\") {\n depth = Math.max(0, depth - 1);\n } else if (character === \"?\" && depth === 0) {\n ternaryDepth += 1;\n } else if (character === \":\" && depth === 0 && ternaryDepth > 0) {\n ternaryDepth -= 1;\n } else if (character === \"\\n\" && depth === 0 && ternaryDepth === 0) {\n // A top-level ternary may begin on the next line after its condition.\n let next = index + 1;\n while (next < source.length && /\\s/u.test(source[next]!)) next += 1;\n if (source[next] === \"?\") continue;\n\n const statement = source.slice(start, index).trim();\n if (statement) statements.push(statement);\n start = index + 1;\n }\n }\n\n const finalStatement = source.slice(start).trim();\n if (finalStatement) statements.push(finalStatement);\n return statements;\n}\n\nfunction parseStatements(source: string): Array<{ id: string; expression: string; raw: string }> {\n return splitStatements(stripFences(source)).map((raw) => {\n const match = STATEMENT_PATTERN.exec(raw);\n if (!match) throw new Error(`Invalid OpenUI Lang statement: ${raw}`);\n return { id: match[1]!, expression: match[2]!.trim(), raw };\n });\n}\n\n/**\n * Applies statement-level A2UI component patches without removing temporarily\n * unreachable statements. A later update may attach those statements to root.\n */\nexport function mergeComponentStatements(existing: string, components: readonly string[]): string {\n const statements = new Map<string, string>();\n const order: string[] = [];\n\n const upsert = (source: string, allowDeletion: boolean): void => {\n for (const statement of parseStatements(source)) {\n if (allowDeletion && statement.expression === \"null\") {\n statements.delete(statement.id);\n const index = order.indexOf(statement.id);\n if (index !== -1) order.splice(index, 1);\n continue;\n }\n if (!statements.has(statement.id)) order.push(statement.id);\n statements.set(statement.id, statement.raw);\n }\n };\n\n if (existing.trim()) upsert(existing, false);\n for (const component of components) upsert(component, true);\n\n return order.map((id) => statements.get(id)!).join(\"\\n\");\n}\n","import {\n createParser,\n type ActionEvent,\n type OpenUIError,\n type Parser,\n type ValidationError,\n} from \"@openuidev/lang-core\";\nimport { applyDataModelUpdate, mergeOpenUIStateIntoDataModel, toJsonObject } from \"./json-pointer\";\nimport { validateAgentToRendererMessage } from \"./runtime-schema\";\nimport { mergeComponentStatements } from \"./statement-patch\";\nimport type {\n A2UIClientOptions,\n ActionMessage,\n AgentFunctionResponseMessage,\n AgentToRendererMessage,\n CallAgentFunctionInput,\n DispatchActionInput,\n GenericErrorMessage,\n JsonObject,\n JsonValue,\n OpenUIActionOptions,\n ProcessResult,\n ProtocolValidationIssue,\n RendererDataModel,\n RendererMetadata,\n RendererToAgentMessage,\n SurfaceSnapshot,\n ValidationFailedErrorMessage,\n} from \"./types\";\n\ntype SurfaceListener = () => void;\ntype MessageListener = (message: RendererToAgentMessage, metadata: RendererMetadata) => void;\n\ninterface PendingAgentFunction {\n surfaceId: string;\n resolve: (value: JsonValue) => void;\n reject: (error: Error) => void;\n}\n\nexport class A2UIFunctionError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"A2UIFunctionError\";\n this.code = code;\n }\n}\n\nfunction defaultId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ?? `a2ui-${Date.now()}-${Math.random().toString(16).slice(2)}`\n );\n}\n\nfunction parseError(error: ValidationError): OpenUIError {\n return {\n source: \"parser\",\n code: error.code,\n message: error.message,\n statementId: error.statementId,\n component: error.component,\n path: error.path,\n };\n}\n\nfunction isCreateSurface(\n message: AgentToRendererMessage,\n): message is Extract<AgentToRendererMessage, { createSurface: unknown }> {\n return \"createSurface\" in message;\n}\n\nfunction isUpdateComponents(\n message: AgentToRendererMessage,\n): message is Extract<AgentToRendererMessage, { updateComponents: unknown }> {\n return \"updateComponents\" in message;\n}\n\nfunction isUpdateDataModel(\n message: AgentToRendererMessage,\n): message is Extract<AgentToRendererMessage, { updateDataModel: unknown }> {\n return \"updateDataModel\" in message;\n}\n\nfunction isDeleteSurface(\n message: AgentToRendererMessage,\n): message is Extract<AgentToRendererMessage, { deleteSurface: unknown }> {\n return \"deleteSurface\" in message;\n}\n\nfunction isCallRendererFunction(\n message: AgentToRendererMessage,\n): message is Extract<AgentToRendererMessage, { callRendererFunction: unknown }> {\n return \"callRendererFunction\" in message;\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value != null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction validationTarget(input: unknown): {\n surfaceId?: string;\n functionCallId?: string;\n} {\n const message = record(input);\n if (!message) return {};\n for (const key of [\"createSurface\", \"updateComponents\", \"updateDataModel\", \"deleteSurface\"]) {\n const payload = record(message[key]);\n if (typeof payload?.surfaceId === \"string\") {\n return { surfaceId: payload.surfaceId };\n }\n }\n for (const key of [\"callRendererFunction\", \"agentFunctionResponse\"]) {\n const payload = record(message[key]);\n if (typeof payload?.functionCallId === \"string\") {\n return { functionCallId: payload.functionCallId };\n }\n }\n return {};\n}\n\nexport class A2UIClient {\n readonly #parser: Parser;\n readonly #functions: A2UIClientOptions[\"functions\"];\n readonly #onMessage?: A2UIClientOptions[\"onMessage\"];\n readonly #rendererCapabilities?: A2UIClientOptions[\"rendererCapabilities\"];\n readonly #now: () => Date;\n readonly #createId: () => string;\n readonly #surfaces = new Map<string, SurfaceSnapshot>();\n readonly #surfaceListeners = new Set<SurfaceListener>();\n readonly #messageListeners = new Set<MessageListener>();\n readonly #pendingAgentFunctions = new Map<string, PendingAgentFunction>();\n #revision = 0;\n\n constructor(options: A2UIClientOptions) {\n this.#parser = createParser(options.schema, options.rootName);\n this.#functions = options.functions;\n this.#onMessage = options.onMessage;\n this.#rendererCapabilities = options.rendererCapabilities;\n this.#now = options.now ?? (() => new Date());\n this.#createId = options.createId ?? defaultId;\n }\n\n subscribe(listener: SurfaceListener): () => void {\n this.#surfaceListeners.add(listener);\n return () => this.#surfaceListeners.delete(listener);\n }\n\n subscribeMessages(listener: MessageListener): () => void {\n this.#messageListeners.add(listener);\n return () => this.#messageListeners.delete(listener);\n }\n\n getSurface(surfaceId: string): SurfaceSnapshot | undefined {\n return this.#surfaces.get(surfaceId);\n }\n\n getSurfaces(): SurfaceSnapshot[] {\n return [...this.#surfaces.values()];\n }\n\n getRendererDataModel(): RendererDataModel | undefined {\n const surfaces = Object.fromEntries(\n [...this.#surfaces]\n .filter(([, surface]) => surface.sendDataModel)\n .map(([surfaceId, surface]) => [surfaceId, structuredClone(surface.dataModel)]),\n );\n if (Object.keys(surfaces).length === 0) return undefined;\n return {\n version: \"v1.0\",\n surfaces,\n };\n }\n\n getRendererMetadata(): RendererMetadata {\n const dataModel = this.getRendererDataModel();\n return {\n ...(this.#rendererCapabilities\n ? { a2uiRendererCapabilities: structuredClone(this.#rendererCapabilities) }\n : {}),\n ...(dataModel ? { a2uiRendererDataModel: dataModel } : {}),\n };\n }\n\n async process(input: unknown): Promise<ProcessResult> {\n const outbound: RendererToAgentMessage[] = [];\n const capture = (next: RendererToAgentMessage) => outbound.push(next);\n this.#messageListeners.add(capture);\n try {\n const validated = validateAgentToRendererMessage(input);\n if (!validated.success) return this.#invalidMessage(input, validated.issues, outbound);\n const message = validated.message;\n\n if (isCreateSurface(message)) return this.#createSurface(message, outbound);\n if (isUpdateComponents(message)) return this.#updateComponents(message, outbound);\n if (isUpdateDataModel(message)) return this.#updateDataModel(message, outbound);\n if (isDeleteSurface(message)) return this.#deleteSurface(message, outbound);\n if (isCallRendererFunction(message)) {\n return await this.#callRendererFunction(message, outbound);\n }\n return this.#agentFunctionResponse(message, outbound);\n } finally {\n this.#messageListeners.delete(capture);\n }\n }\n\n updateSurfaceFromOpenUIState(surfaceId: string, state: Record<string, unknown>): boolean {\n const surface = this.#surfaces.get(surfaceId);\n if (!surface) return false;\n const dataModel = mergeOpenUIStateIntoDataModel(surface.dataModel, state);\n if (JSON.stringify(dataModel) === JSON.stringify(surface.dataModel)) return false;\n this.#replaceSurface({\n ...surface,\n dataModel,\n });\n return true;\n }\n\n dispatchOpenUIAction(\n surfaceId: string,\n event: ActionEvent,\n options: OpenUIActionOptions = {},\n ): void {\n const eventSourceComponentId = (event as ActionEvent & { sourceComponentId?: unknown })\n .sourceComponentId;\n const context: JsonObject = {\n ...toJsonObject(event.params),\n ...(event.formState ? { formState: toJsonObject(event.formState) } : {}),\n ...options.context,\n };\n this.dispatchAction({\n surfaceId,\n sourceComponentId:\n options.sourceComponentId ??\n (typeof eventSourceComponentId === \"string\" ? eventSourceComponentId : \"root\"),\n name: options.name ?? event.type,\n userMessage: (options.userMessage ?? event.humanFriendlyMessage) || undefined,\n context,\n metadata: options.metadata,\n });\n }\n\n dispatchAction(input: DispatchActionInput): void {\n if (!this.#surfaces.has(input.surfaceId)) {\n this.#emitGenericError(\n \"SURFACE_NOT_FOUND\",\n `Unknown surface: ${input.surfaceId}`,\n input.surfaceId,\n );\n return;\n }\n\n const message: ActionMessage = {\n version: \"v1.0\",\n action: {\n name: input.name,\n ...(input.userMessage ? { userMessage: input.userMessage } : {}),\n surfaceId: input.surfaceId,\n sourceComponentId: input.sourceComponentId,\n timestamp: this.#now().toISOString(),\n context: input.context ?? {},\n ...(input.metadata ? { metadata: input.metadata } : {}),\n },\n };\n this.#emit(message);\n }\n\n callAgentFunction(input: CallAgentFunctionInput): Promise<JsonValue> {\n if (!this.#surfaces.has(input.surfaceId)) {\n const message = `Unknown surface: ${input.surfaceId}`;\n this.#emitGenericError(\"SURFACE_NOT_FOUND\", message, input.surfaceId);\n return Promise.reject(new A2UIFunctionError(\"SURFACE_NOT_FOUND\", message));\n }\n\n const functionCallId = this.#createId();\n return new Promise<JsonValue>((resolve, reject) => {\n this.#pendingAgentFunctions.set(functionCallId, {\n surfaceId: input.surfaceId,\n resolve,\n reject,\n });\n this.#emit({\n version: \"v1.0\",\n callAgentFunction: {\n surfaceId: input.surfaceId,\n functionCallId,\n callFunction: {\n call: input.call,\n ...(input.catalogId ? { catalogId: input.catalogId } : {}),\n ...(input.args ? { args: input.args } : {}),\n },\n },\n });\n });\n }\n\n dispose(): void {\n for (const pending of this.#pendingAgentFunctions.values()) {\n pending.reject(new A2UIFunctionError(\"CLIENT_DISPOSED\", \"A2UI client was disposed\"));\n }\n this.#pendingAgentFunctions.clear();\n this.#surfaces.clear();\n this.#surfaceListeners.clear();\n this.#messageListeners.clear();\n }\n\n #createSurface(\n message: Extract<AgentToRendererMessage, { createSurface: unknown }>,\n outbound: RendererToAgentMessage[],\n ): ProcessResult {\n const input = message.createSurface;\n if (this.#surfaces.has(input.surfaceId)) {\n this.#emitGenericError(\n \"SURFACE_ALREADY_EXISTS\",\n `Surface already exists: ${input.surfaceId}`,\n input.surfaceId,\n );\n return { ok: false, outbound };\n }\n const supportedCatalogIds = this.#rendererCapabilities?.[\"v1.0\"].supportedCatalogIds ?? [];\n if (\n input.catalogId &&\n supportedCatalogIds.length > 0 &&\n !supportedCatalogIds.includes(input.catalogId)\n ) {\n this.#emitGenericError(\n \"UNSUPPORTED_CATALOG\",\n `Renderer does not support catalog: ${input.catalogId}`,\n input.surfaceId,\n );\n return { ok: false, outbound };\n }\n\n let source = \"\";\n let parseResult: SurfaceSnapshot[\"parseResult\"] = null;\n let errors: OpenUIError[] = [];\n if (input.components) {\n try {\n ({ source, parseResult, errors } = this.#mergeComponents(\"\", input.components));\n } catch (error) {\n this.#emitValidationError(\n input.surfaceId,\n \"/createSurface/components\",\n error instanceof Error ? error.message : String(error),\n );\n return { ok: false, outbound };\n }\n }\n this.#replaceSurface({\n surfaceId: input.surfaceId,\n catalogId: input.catalogId,\n metadata: input.metadata,\n sendDataModel: input.sendDataModel ?? false,\n source,\n dataModel: structuredClone(input.dataModel ?? {}),\n parseResult,\n errors,\n revision: 0,\n });\n for (const error of errors) {\n this.#emitValidationError(\n input.surfaceId,\n \"/createSurface/components\",\n error.statementId ? `${error.statementId}: ${error.message}` : error.message,\n );\n }\n return { ok: errors.length === 0, outbound };\n }\n\n #updateComponents(\n message: Extract<AgentToRendererMessage, { updateComponents: unknown }>,\n outbound: RendererToAgentMessage[],\n ): ProcessResult {\n const input = message.updateComponents;\n const surface = this.#requireSurface(input.surfaceId);\n if (!surface) return { ok: false, outbound };\n try {\n const { source, parseResult, errors } = this.#mergeComponents(\n surface.source,\n input.components,\n );\n this.#replaceSurface({ ...surface, source, parseResult, errors });\n for (const error of errors) {\n this.#emitValidationError(\n input.surfaceId,\n \"/updateComponents/components\",\n error.statementId ? `${error.statementId}: ${error.message}` : error.message,\n );\n }\n return { ok: errors.length === 0, outbound };\n } catch (error) {\n this.#emitValidationError(\n input.surfaceId,\n \"/updateComponents/components\",\n error instanceof Error ? error.message : String(error),\n );\n return { ok: false, outbound };\n }\n }\n\n #updateDataModel(\n message: Extract<AgentToRendererMessage, { updateDataModel: unknown }>,\n outbound: RendererToAgentMessage[],\n ): ProcessResult {\n const input = message.updateDataModel;\n const surface = this.#requireSurface(input.surfaceId);\n if (!surface) return { ok: false, outbound };\n try {\n const dataModel = applyDataModelUpdate(surface.dataModel, input.path, input.value);\n this.#replaceSurface({ ...surface, dataModel });\n return { ok: true, outbound };\n } catch (error) {\n this.#emitValidationError(\n input.surfaceId,\n \"/updateDataModel/path\",\n error instanceof Error ? error.message : String(error),\n );\n return { ok: false, outbound };\n }\n }\n\n #deleteSurface(\n message: Extract<AgentToRendererMessage, { deleteSurface: unknown }>,\n outbound: RendererToAgentMessage[],\n ): ProcessResult {\n const surfaceId = message.deleteSurface.surfaceId;\n if (!this.#requireSurface(surfaceId)) return { ok: false, outbound };\n this.#surfaces.delete(surfaceId);\n for (const [functionCallId, pending] of this.#pendingAgentFunctions) {\n if (pending.surfaceId === surfaceId) {\n pending.reject(\n new A2UIFunctionError(\"SURFACE_DELETED\", `Surface was deleted: ${surfaceId}`),\n );\n this.#pendingAgentFunctions.delete(functionCallId);\n }\n }\n this.#notify();\n return { ok: true, outbound };\n }\n\n async #callRendererFunction(\n message: Extract<AgentToRendererMessage, { callRendererFunction: unknown }>,\n outbound: RendererToAgentMessage[],\n ): Promise<ProcessResult> {\n const { functionCallId, callFunction } = message.callRendererFunction;\n const { call, catalogId, args = {} } = callFunction;\n const registration = this.#functions?.[call];\n if (!registration) {\n this.#emitGenericError(\n \"INVALID_FUNCTION_CALL\",\n `Renderer function is not registered: ${call}`,\n undefined,\n functionCallId,\n );\n return { ok: false, outbound };\n }\n const fn = typeof registration === \"function\" ? registration : registration.handler;\n if (\n typeof registration === \"function\" ||\n (registration.allowedCallers ?? \"rendererOnly\") === \"rendererOnly\" ||\n registration.catalogId !== catalogId\n ) {\n this.#emitGenericError(\n \"INVALID_FUNCTION_CALL\",\n `Renderer function is not callable from catalog ${catalogId}: ${call}`,\n undefined,\n functionCallId,\n );\n return { ok: false, outbound };\n }\n try {\n const value = await fn(args);\n this.#emit({\n version: \"v1.0\",\n rendererFunctionResponse: { functionCallId, value },\n });\n return { ok: true, outbound };\n } catch (error) {\n this.#emit({\n version: \"v1.0\",\n rendererFunctionResponse: {\n functionCallId,\n error: {\n code: \"EXECUTION_FAILED\",\n message: error instanceof Error ? error.message : String(error),\n },\n },\n });\n return { ok: false, outbound };\n }\n }\n\n #agentFunctionResponse(\n message: AgentFunctionResponseMessage,\n outbound: RendererToAgentMessage[],\n ): ProcessResult {\n const response = message.agentFunctionResponse;\n const pending = this.#pendingAgentFunctions.get(response.functionCallId);\n if (!pending) {\n return {\n ok: false,\n outbound,\n issues: [\n {\n path: \"/agentFunctionResponse/functionCallId\",\n message: `Unknown functionCallId: ${response.functionCallId}`,\n },\n ],\n };\n }\n this.#pendingAgentFunctions.delete(response.functionCallId);\n if (\"error\" in response) {\n pending.reject(new A2UIFunctionError(response.error.code, response.error.message));\n return { ok: true, outbound };\n }\n pending.resolve(response.value);\n return { ok: true, outbound };\n }\n\n #replaceSurface(surface: Omit<SurfaceSnapshot, \"revision\"> & { revision?: number }): void {\n this.#revision += 1;\n this.#surfaces.set(surface.surfaceId, { ...surface, revision: this.#revision });\n this.#notify();\n }\n\n #mergeComponents(\n existing: string,\n components: string[],\n ): Pick<SurfaceSnapshot, \"source\" | \"parseResult\" | \"errors\"> {\n const source = mergeComponentStatements(existing, components);\n const parseResult = this.#parser.parse(source);\n return {\n source,\n parseResult,\n errors: parseResult.meta.errors.map(parseError),\n };\n }\n\n #invalidMessage(\n input: unknown,\n issues: ProtocolValidationIssue[],\n outbound: RendererToAgentMessage[],\n ): ProcessResult {\n const target = validationTarget(input);\n const issue = issues[0] ?? { path: \"/\", message: \"Invalid A2UI message\" };\n if (target.surfaceId !== undefined) {\n this.#emitValidationError(target.surfaceId, issue.path, issue.message);\n return { ok: false, outbound, issues };\n }\n if (target.functionCallId !== undefined) {\n this.#emitGenericError(\n \"INVALID_MESSAGE\",\n `${issue.path}: ${issue.message}`,\n undefined,\n target.functionCallId,\n );\n return { ok: false, outbound, issues };\n }\n return { ok: false, outbound, issues };\n }\n\n #requireSurface(surfaceId: string): SurfaceSnapshot | undefined {\n const surface = this.#surfaces.get(surfaceId);\n if (!surface) {\n this.#emitGenericError(\"SURFACE_NOT_FOUND\", `Unknown surface: ${surfaceId}`, surfaceId);\n }\n return surface;\n }\n\n #emitValidationError(surfaceId: string, path: string, message: string): void {\n const error: ValidationFailedErrorMessage = {\n version: \"v1.0\",\n error: { code: \"VALIDATION_FAILED\", surfaceId, path, message },\n };\n this.#emit(error);\n }\n\n #emitGenericError(\n code: string,\n message: string,\n surfaceId?: string,\n functionCallId?: string,\n ): void {\n if (surfaceId === undefined && functionCallId === undefined) return;\n const error: GenericErrorMessage =\n surfaceId !== undefined\n ? { version: \"v1.0\", error: { code, message, surfaceId } }\n : { version: \"v1.0\", error: { code, message, functionCallId: functionCallId! } };\n this.#emit(error);\n }\n\n #emit(message: RendererToAgentMessage): void {\n const metadata = this.getRendererMetadata();\n this.#onMessage?.(message, metadata);\n for (const listener of this.#messageListeners) listener(message, metadata);\n }\n\n #notify(): void {\n for (const listener of this.#surfaceListeners) listener();\n }\n}\n\nexport function createA2UIClient(options: A2UIClientOptions): A2UIClient {\n return new A2UIClient(options);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
//#region src/json-pointer.ts
|
|
2
|
+
function decodeToken(token) {
|
|
3
|
+
return token.replace(/~1/g, "/").replace(/~0/g, "~");
|
|
4
|
+
}
|
|
5
|
+
function tokensFor(path) {
|
|
6
|
+
if (path == null || path === "" || path === "/") return [];
|
|
7
|
+
if (!path.startsWith("/")) throw new Error(`JSON Pointer must start with "/": ${path}`);
|
|
8
|
+
return path.slice(1).split("/").map(decodeToken);
|
|
9
|
+
}
|
|
10
|
+
function isArrayIndex(value) {
|
|
11
|
+
return /^(0|[1-9]\d*)$/.test(value);
|
|
12
|
+
}
|
|
13
|
+
function containerFor(nextToken) {
|
|
14
|
+
return isArrayIndex(nextToken) ? [] : {};
|
|
15
|
+
}
|
|
16
|
+
function applyDataModelUpdate(current, path, value) {
|
|
17
|
+
const tokens = tokensFor(path);
|
|
18
|
+
if (tokens.length === 0) {
|
|
19
|
+
if (value === null) return {};
|
|
20
|
+
if (typeof value !== "object" || Array.isArray(value)) throw new Error("The root A2UI data model must be an object");
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
const root = structuredClone(current);
|
|
24
|
+
let cursor = root;
|
|
25
|
+
for (let i = 0; i < tokens.length - 1; i++) {
|
|
26
|
+
const token = tokens[i];
|
|
27
|
+
const nextToken = tokens[i + 1];
|
|
28
|
+
if (Array.isArray(cursor)) {
|
|
29
|
+
if (!isArrayIndex(token)) throw new Error(`Invalid array index in JSON Pointer: ${token}`);
|
|
30
|
+
const index = Number(token);
|
|
31
|
+
const existing = cursor[index];
|
|
32
|
+
if (existing == null || typeof existing !== "object") cursor[index] = containerFor(nextToken);
|
|
33
|
+
const child = cursor[index];
|
|
34
|
+
if (child == null || typeof child !== "object") throw new Error(`Cannot traverse JSON Pointer segment: ${token}`);
|
|
35
|
+
cursor = child;
|
|
36
|
+
} else {
|
|
37
|
+
const existing = cursor[token];
|
|
38
|
+
if (existing == null || typeof existing !== "object") cursor[token] = containerFor(nextToken);
|
|
39
|
+
const child = cursor[token];
|
|
40
|
+
if (child == null || typeof child !== "object") throw new Error(`Cannot traverse JSON Pointer segment: ${token}`);
|
|
41
|
+
cursor = child;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const leaf = tokens[tokens.length - 1];
|
|
45
|
+
if (Array.isArray(cursor)) {
|
|
46
|
+
if (!isArrayIndex(leaf)) throw new Error(`Invalid array index in JSON Pointer: ${leaf}`);
|
|
47
|
+
const index = Number(leaf);
|
|
48
|
+
if (value === null) cursor.splice(index, 1);
|
|
49
|
+
else cursor[index] = value;
|
|
50
|
+
} else if (value === null) delete cursor[leaf];
|
|
51
|
+
else cursor[leaf] = value;
|
|
52
|
+
return root;
|
|
53
|
+
}
|
|
54
|
+
function unwrapFormValue(value) {
|
|
55
|
+
if (value === void 0) return void 0;
|
|
56
|
+
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") return value;
|
|
57
|
+
if (Array.isArray(value)) return value.map(unwrapFormValue).filter((item) => item !== void 0);
|
|
58
|
+
if (typeof value === "object") {
|
|
59
|
+
const object = value;
|
|
60
|
+
if ("value" in object && "componentType" in object) return unwrapFormValue(object.value);
|
|
61
|
+
const result = {};
|
|
62
|
+
for (const [key, child] of Object.entries(object)) {
|
|
63
|
+
const unwrapped = unwrapFormValue(child);
|
|
64
|
+
if (unwrapped !== void 0) result[key] = unwrapped;
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function dataModelToOpenUIState(dataModel, formStateKeys = []) {
|
|
70
|
+
const state = {};
|
|
71
|
+
for (const [key, value] of Object.entries(dataModel)) state[`$${key}`] = value;
|
|
72
|
+
for (const key of formStateKeys) if (key in dataModel) state[key] = dataModel[key];
|
|
73
|
+
return state;
|
|
74
|
+
}
|
|
75
|
+
function mergeOpenUIStateIntoDataModel(current, state) {
|
|
76
|
+
const next = structuredClone(current);
|
|
77
|
+
const keys = new Set([...Object.keys(current), ...Object.keys(state).map((key) => key.startsWith("$") ? key.slice(1) : key)]);
|
|
78
|
+
for (const key of keys) {
|
|
79
|
+
const hasFormState = Object.prototype.hasOwnProperty.call(state, key);
|
|
80
|
+
const hasBindingState = Object.prototype.hasOwnProperty.call(state, `$${key}`);
|
|
81
|
+
const formValue = hasFormState ? unwrapFormValue(state[key]) : void 0;
|
|
82
|
+
const bindingValue = hasBindingState ? unwrapFormValue(state[`$${key}`]) : void 0;
|
|
83
|
+
if (hasFormState && formValue !== void 0) next[key] = formValue;
|
|
84
|
+
else if (hasBindingState && bindingValue !== void 0) next[key] = bindingValue;
|
|
85
|
+
}
|
|
86
|
+
return next;
|
|
87
|
+
}
|
|
88
|
+
function toJsonObject(value) {
|
|
89
|
+
return unwrapFormValue(value ?? {}) ?? {};
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
Object.defineProperty(exports, "applyDataModelUpdate", {
|
|
93
|
+
enumerable: true,
|
|
94
|
+
get: function() {
|
|
95
|
+
return applyDataModelUpdate;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
Object.defineProperty(exports, "dataModelToOpenUIState", {
|
|
99
|
+
enumerable: true,
|
|
100
|
+
get: function() {
|
|
101
|
+
return dataModelToOpenUIState;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
Object.defineProperty(exports, "mergeOpenUIStateIntoDataModel", {
|
|
105
|
+
enumerable: true,
|
|
106
|
+
get: function() {
|
|
107
|
+
return mergeOpenUIStateIntoDataModel;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
Object.defineProperty(exports, "toJsonObject", {
|
|
111
|
+
enumerable: true,
|
|
112
|
+
get: function() {
|
|
113
|
+
return toJsonObject;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=json-pointer-CA9LEWAP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-pointer-CA9LEWAP.cjs","names":[],"sources":["../src/json-pointer.ts"],"sourcesContent":["import type { JsonObject, JsonValue } from \"./types\";\n\nfunction decodeToken(token: string): string {\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nfunction tokensFor(path: string | undefined): string[] {\n if (path == null || path === \"\" || path === \"/\") return [];\n if (!path.startsWith(\"/\")) throw new Error(`JSON Pointer must start with \"/\": ${path}`);\n return path.slice(1).split(\"/\").map(decodeToken);\n}\n\nfunction isArrayIndex(value: string): boolean {\n return /^(0|[1-9]\\d*)$/.test(value);\n}\n\nfunction containerFor(nextToken: string): JsonObject | JsonValue[] {\n return isArrayIndex(nextToken) ? [] : {};\n}\n\nexport function applyDataModelUpdate(\n current: JsonObject,\n path: string | undefined,\n value: JsonValue,\n): JsonObject {\n const tokens = tokensFor(path);\n if (tokens.length === 0) {\n if (value === null) return {};\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"The root A2UI data model must be an object\");\n }\n return value;\n }\n\n const root = structuredClone(current);\n let cursor: JsonObject | JsonValue[] = root;\n\n for (let i = 0; i < tokens.length - 1; i++) {\n const token = tokens[i]!;\n const nextToken = tokens[i + 1]!;\n if (Array.isArray(cursor)) {\n if (!isArrayIndex(token)) throw new Error(`Invalid array index in JSON Pointer: ${token}`);\n const index = Number(token);\n const existing = cursor[index];\n if (existing == null || typeof existing !== \"object\") {\n cursor[index] = containerFor(nextToken);\n }\n const child = cursor[index];\n if (child == null || typeof child !== \"object\") {\n throw new Error(`Cannot traverse JSON Pointer segment: ${token}`);\n }\n cursor = child as JsonObject | JsonValue[];\n } else {\n const existing = cursor[token];\n if (existing == null || typeof existing !== \"object\") {\n cursor[token] = containerFor(nextToken);\n }\n const child = cursor[token];\n if (child == null || typeof child !== \"object\") {\n throw new Error(`Cannot traverse JSON Pointer segment: ${token}`);\n }\n cursor = child as JsonObject | JsonValue[];\n }\n }\n\n const leaf = tokens[tokens.length - 1]!;\n if (Array.isArray(cursor)) {\n if (!isArrayIndex(leaf)) throw new Error(`Invalid array index in JSON Pointer: ${leaf}`);\n const index = Number(leaf);\n if (value === null) cursor.splice(index, 1);\n else cursor[index] = value;\n } else if (value === null) {\n delete cursor[leaf];\n } else {\n cursor[leaf] = value;\n }\n\n return root;\n}\n\nfunction unwrapFormValue(value: unknown): JsonValue | undefined {\n if (value === undefined) return undefined;\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(unwrapFormValue).filter((item): item is JsonValue => item !== undefined);\n }\n if (typeof value === \"object\") {\n const object = value as Record<string, unknown>;\n if (\"value\" in object && \"componentType\" in object) return unwrapFormValue(object.value);\n const result: JsonObject = {};\n for (const [key, child] of Object.entries(object)) {\n const unwrapped = unwrapFormValue(child);\n if (unwrapped !== undefined) result[key] = unwrapped;\n }\n return result;\n }\n return undefined;\n}\n\nexport function dataModelToOpenUIState(\n dataModel: JsonObject,\n formStateKeys: Iterable<string> = [],\n): Record<string, unknown> {\n const state: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(dataModel)) {\n // $key is the canonical owner for Lang bindings such as $user.name.\n state[`$${key}`] = value;\n }\n // Form namespaces are opt-in so a stale form mirror cannot overwrite a\n // reactive $binding with the same top-level data-model key.\n for (const key of formStateKeys) {\n if (key in dataModel) state[key] = dataModel[key];\n }\n return state;\n}\n\nexport function mergeOpenUIStateIntoDataModel(\n current: JsonObject,\n state: Record<string, unknown>,\n): JsonObject {\n const next = structuredClone(current);\n const keys = new Set([\n ...Object.keys(current),\n ...Object.keys(state).map((key) => (key.startsWith(\"$\") ? key.slice(1) : key)),\n ]);\n for (const key of keys) {\n const hasFormState = Object.prototype.hasOwnProperty.call(state, key);\n const hasBindingState = Object.prototype.hasOwnProperty.call(state, `$${key}`);\n const formValue = hasFormState ? unwrapFormValue(state[key]) : undefined;\n const bindingValue = hasBindingState ? unwrapFormValue(state[`$${key}`]) : undefined;\n\n // Once a real form namespace exists it owns that data-model key. Bindings\n // own every other key. This avoids change-detection races between mirrors.\n if (hasFormState && formValue !== undefined) next[key] = formValue;\n else if (hasBindingState && bindingValue !== undefined) next[key] = bindingValue;\n }\n return next;\n}\n\nexport function toJsonObject(value: Record<string, unknown> | undefined): JsonObject {\n return (unwrapFormValue(value ?? {}) as JsonObject | undefined) ?? {};\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//#region src/json-pointer.ts
|
|
2
|
+
function decodeToken(token) {
|
|
3
|
+
return token.replace(/~1/g, "/").replace(/~0/g, "~");
|
|
4
|
+
}
|
|
5
|
+
function tokensFor(path) {
|
|
6
|
+
if (path == null || path === "" || path === "/") return [];
|
|
7
|
+
if (!path.startsWith("/")) throw new Error(`JSON Pointer must start with "/": ${path}`);
|
|
8
|
+
return path.slice(1).split("/").map(decodeToken);
|
|
9
|
+
}
|
|
10
|
+
function isArrayIndex(value) {
|
|
11
|
+
return /^(0|[1-9]\d*)$/.test(value);
|
|
12
|
+
}
|
|
13
|
+
function containerFor(nextToken) {
|
|
14
|
+
return isArrayIndex(nextToken) ? [] : {};
|
|
15
|
+
}
|
|
16
|
+
function applyDataModelUpdate(current, path, value) {
|
|
17
|
+
const tokens = tokensFor(path);
|
|
18
|
+
if (tokens.length === 0) {
|
|
19
|
+
if (value === null) return {};
|
|
20
|
+
if (typeof value !== "object" || Array.isArray(value)) throw new Error("The root A2UI data model must be an object");
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
const root = structuredClone(current);
|
|
24
|
+
let cursor = root;
|
|
25
|
+
for (let i = 0; i < tokens.length - 1; i++) {
|
|
26
|
+
const token = tokens[i];
|
|
27
|
+
const nextToken = tokens[i + 1];
|
|
28
|
+
if (Array.isArray(cursor)) {
|
|
29
|
+
if (!isArrayIndex(token)) throw new Error(`Invalid array index in JSON Pointer: ${token}`);
|
|
30
|
+
const index = Number(token);
|
|
31
|
+
const existing = cursor[index];
|
|
32
|
+
if (existing == null || typeof existing !== "object") cursor[index] = containerFor(nextToken);
|
|
33
|
+
const child = cursor[index];
|
|
34
|
+
if (child == null || typeof child !== "object") throw new Error(`Cannot traverse JSON Pointer segment: ${token}`);
|
|
35
|
+
cursor = child;
|
|
36
|
+
} else {
|
|
37
|
+
const existing = cursor[token];
|
|
38
|
+
if (existing == null || typeof existing !== "object") cursor[token] = containerFor(nextToken);
|
|
39
|
+
const child = cursor[token];
|
|
40
|
+
if (child == null || typeof child !== "object") throw new Error(`Cannot traverse JSON Pointer segment: ${token}`);
|
|
41
|
+
cursor = child;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const leaf = tokens[tokens.length - 1];
|
|
45
|
+
if (Array.isArray(cursor)) {
|
|
46
|
+
if (!isArrayIndex(leaf)) throw new Error(`Invalid array index in JSON Pointer: ${leaf}`);
|
|
47
|
+
const index = Number(leaf);
|
|
48
|
+
if (value === null) cursor.splice(index, 1);
|
|
49
|
+
else cursor[index] = value;
|
|
50
|
+
} else if (value === null) delete cursor[leaf];
|
|
51
|
+
else cursor[leaf] = value;
|
|
52
|
+
return root;
|
|
53
|
+
}
|
|
54
|
+
function unwrapFormValue(value) {
|
|
55
|
+
if (value === void 0) return void 0;
|
|
56
|
+
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") return value;
|
|
57
|
+
if (Array.isArray(value)) return value.map(unwrapFormValue).filter((item) => item !== void 0);
|
|
58
|
+
if (typeof value === "object") {
|
|
59
|
+
const object = value;
|
|
60
|
+
if ("value" in object && "componentType" in object) return unwrapFormValue(object.value);
|
|
61
|
+
const result = {};
|
|
62
|
+
for (const [key, child] of Object.entries(object)) {
|
|
63
|
+
const unwrapped = unwrapFormValue(child);
|
|
64
|
+
if (unwrapped !== void 0) result[key] = unwrapped;
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function dataModelToOpenUIState(dataModel, formStateKeys = []) {
|
|
70
|
+
const state = {};
|
|
71
|
+
for (const [key, value] of Object.entries(dataModel)) state[`$${key}`] = value;
|
|
72
|
+
for (const key of formStateKeys) if (key in dataModel) state[key] = dataModel[key];
|
|
73
|
+
return state;
|
|
74
|
+
}
|
|
75
|
+
function mergeOpenUIStateIntoDataModel(current, state) {
|
|
76
|
+
const next = structuredClone(current);
|
|
77
|
+
const keys = new Set([...Object.keys(current), ...Object.keys(state).map((key) => key.startsWith("$") ? key.slice(1) : key)]);
|
|
78
|
+
for (const key of keys) {
|
|
79
|
+
const hasFormState = Object.prototype.hasOwnProperty.call(state, key);
|
|
80
|
+
const hasBindingState = Object.prototype.hasOwnProperty.call(state, `$${key}`);
|
|
81
|
+
const formValue = hasFormState ? unwrapFormValue(state[key]) : void 0;
|
|
82
|
+
const bindingValue = hasBindingState ? unwrapFormValue(state[`$${key}`]) : void 0;
|
|
83
|
+
if (hasFormState && formValue !== void 0) next[key] = formValue;
|
|
84
|
+
else if (hasBindingState && bindingValue !== void 0) next[key] = bindingValue;
|
|
85
|
+
}
|
|
86
|
+
return next;
|
|
87
|
+
}
|
|
88
|
+
function toJsonObject(value) {
|
|
89
|
+
return unwrapFormValue(value ?? {}) ?? {};
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { toJsonObject as i, dataModelToOpenUIState as n, mergeOpenUIStateIntoDataModel as r, applyDataModelUpdate as t };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=json-pointer-DCdSrMT3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-pointer-DCdSrMT3.mjs","names":[],"sources":["../src/json-pointer.ts"],"sourcesContent":["import type { JsonObject, JsonValue } from \"./types\";\n\nfunction decodeToken(token: string): string {\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nfunction tokensFor(path: string | undefined): string[] {\n if (path == null || path === \"\" || path === \"/\") return [];\n if (!path.startsWith(\"/\")) throw new Error(`JSON Pointer must start with \"/\": ${path}`);\n return path.slice(1).split(\"/\").map(decodeToken);\n}\n\nfunction isArrayIndex(value: string): boolean {\n return /^(0|[1-9]\\d*)$/.test(value);\n}\n\nfunction containerFor(nextToken: string): JsonObject | JsonValue[] {\n return isArrayIndex(nextToken) ? [] : {};\n}\n\nexport function applyDataModelUpdate(\n current: JsonObject,\n path: string | undefined,\n value: JsonValue,\n): JsonObject {\n const tokens = tokensFor(path);\n if (tokens.length === 0) {\n if (value === null) return {};\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"The root A2UI data model must be an object\");\n }\n return value;\n }\n\n const root = structuredClone(current);\n let cursor: JsonObject | JsonValue[] = root;\n\n for (let i = 0; i < tokens.length - 1; i++) {\n const token = tokens[i]!;\n const nextToken = tokens[i + 1]!;\n if (Array.isArray(cursor)) {\n if (!isArrayIndex(token)) throw new Error(`Invalid array index in JSON Pointer: ${token}`);\n const index = Number(token);\n const existing = cursor[index];\n if (existing == null || typeof existing !== \"object\") {\n cursor[index] = containerFor(nextToken);\n }\n const child = cursor[index];\n if (child == null || typeof child !== \"object\") {\n throw new Error(`Cannot traverse JSON Pointer segment: ${token}`);\n }\n cursor = child as JsonObject | JsonValue[];\n } else {\n const existing = cursor[token];\n if (existing == null || typeof existing !== \"object\") {\n cursor[token] = containerFor(nextToken);\n }\n const child = cursor[token];\n if (child == null || typeof child !== \"object\") {\n throw new Error(`Cannot traverse JSON Pointer segment: ${token}`);\n }\n cursor = child as JsonObject | JsonValue[];\n }\n }\n\n const leaf = tokens[tokens.length - 1]!;\n if (Array.isArray(cursor)) {\n if (!isArrayIndex(leaf)) throw new Error(`Invalid array index in JSON Pointer: ${leaf}`);\n const index = Number(leaf);\n if (value === null) cursor.splice(index, 1);\n else cursor[index] = value;\n } else if (value === null) {\n delete cursor[leaf];\n } else {\n cursor[leaf] = value;\n }\n\n return root;\n}\n\nfunction unwrapFormValue(value: unknown): JsonValue | undefined {\n if (value === undefined) return undefined;\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(unwrapFormValue).filter((item): item is JsonValue => item !== undefined);\n }\n if (typeof value === \"object\") {\n const object = value as Record<string, unknown>;\n if (\"value\" in object && \"componentType\" in object) return unwrapFormValue(object.value);\n const result: JsonObject = {};\n for (const [key, child] of Object.entries(object)) {\n const unwrapped = unwrapFormValue(child);\n if (unwrapped !== undefined) result[key] = unwrapped;\n }\n return result;\n }\n return undefined;\n}\n\nexport function dataModelToOpenUIState(\n dataModel: JsonObject,\n formStateKeys: Iterable<string> = [],\n): Record<string, unknown> {\n const state: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(dataModel)) {\n // $key is the canonical owner for Lang bindings such as $user.name.\n state[`$${key}`] = value;\n }\n // Form namespaces are opt-in so a stale form mirror cannot overwrite a\n // reactive $binding with the same top-level data-model key.\n for (const key of formStateKeys) {\n if (key in dataModel) state[key] = dataModel[key];\n }\n return state;\n}\n\nexport function mergeOpenUIStateIntoDataModel(\n current: JsonObject,\n state: Record<string, unknown>,\n): JsonObject {\n const next = structuredClone(current);\n const keys = new Set([\n ...Object.keys(current),\n ...Object.keys(state).map((key) => (key.startsWith(\"$\") ? key.slice(1) : key)),\n ]);\n for (const key of keys) {\n const hasFormState = Object.prototype.hasOwnProperty.call(state, key);\n const hasBindingState = Object.prototype.hasOwnProperty.call(state, `$${key}`);\n const formValue = hasFormState ? unwrapFormValue(state[key]) : undefined;\n const bindingValue = hasBindingState ? unwrapFormValue(state[`$${key}`]) : undefined;\n\n // Once a real form namespace exists it owns that data-model key. Bindings\n // own every other key. This avoids change-detection races between mirrors.\n if (hasFormState && formValue !== undefined) next[key] = formValue;\n else if (hasBindingState && bindingValue !== undefined) next[key] = bindingValue;\n }\n return next;\n}\n\nexport function toJsonObject(value: Record<string, unknown> | undefined): JsonObject {\n return (unwrapFormValue(value ?? {}) as JsonObject | undefined) ?? {};\n}\n"],"mappings":"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"}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_json_pointer = require("./json-pointer-CA9LEWAP.cjs");
|
|
3
|
+
let _openuidev_lang_core = require("@openuidev/lang-core");
|
|
4
|
+
let _openuidev_react_lang = require("@openuidev/react-lang");
|
|
5
|
+
let react = require("react");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
//#region src/Renderer.tsx
|
|
8
|
+
function collectFormStateKeys(result) {
|
|
9
|
+
const keys = /* @__PURE__ */ new Set();
|
|
10
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
11
|
+
const visit = (value) => {
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
for (const item of value) visit(item);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (!value || typeof value !== "object" || seen.has(value)) return;
|
|
17
|
+
seen.add(value);
|
|
18
|
+
const object = value;
|
|
19
|
+
if (object.type === "element" && object.typeName === "Form") {
|
|
20
|
+
const props = object.props;
|
|
21
|
+
if (typeof props?.name === "string") keys.add(props.name);
|
|
22
|
+
}
|
|
23
|
+
for (const child of Object.values(object)) visit(child);
|
|
24
|
+
};
|
|
25
|
+
visit(result?.root);
|
|
26
|
+
return [...keys];
|
|
27
|
+
}
|
|
28
|
+
function A2UIRenderer({ client, surfaceId, library, mapAction, onAction, onOpenUrl, onStateUpdate, onParseResult, onError, isStreaming = false, formStateKeys, toolProvider, queryLoader }) {
|
|
29
|
+
const subscribe = (0, react.useCallback)((notify) => client.subscribe(notify), [client]);
|
|
30
|
+
const getSnapshot = (0, react.useCallback)(() => client.getSurface(surfaceId), [client, surfaceId]);
|
|
31
|
+
const surface = (0, react.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
|
|
32
|
+
const initialState = (0, react.useMemo)(() => {
|
|
33
|
+
if (!surface) return void 0;
|
|
34
|
+
const keys = new Set([...collectFormStateKeys(surface.parseResult), ...formStateKeys ?? []]);
|
|
35
|
+
return require_json_pointer.dataModelToOpenUIState(surface.dataModel, keys);
|
|
36
|
+
}, [formStateKeys, surface]);
|
|
37
|
+
const agentToolProvider = (0, react.useMemo)(() => ({ async callTool({ name, arguments: args }) {
|
|
38
|
+
return {
|
|
39
|
+
content: [],
|
|
40
|
+
structuredContent: await client.callAgentFunction({
|
|
41
|
+
surfaceId,
|
|
42
|
+
call: name,
|
|
43
|
+
args: require_json_pointer.toJsonObject(args)
|
|
44
|
+
})
|
|
45
|
+
};
|
|
46
|
+
} }), [client, surfaceId]);
|
|
47
|
+
const handleAction = (0, react.useCallback)((event) => {
|
|
48
|
+
const current = client.getSurface(surfaceId);
|
|
49
|
+
if (!current) return;
|
|
50
|
+
if (event.type === _openuidev_lang_core.BuiltinActionType.OpenUrl) {
|
|
51
|
+
const url = event.params?.url;
|
|
52
|
+
if (typeof url === "string") {
|
|
53
|
+
if (onOpenUrl) onOpenUrl(url, event, current);
|
|
54
|
+
else if (typeof window !== "undefined") window.open(url, "_blank", "noopener,noreferrer");
|
|
55
|
+
}
|
|
56
|
+
onAction?.(event, current);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const options = mapAction?.(event, current) ?? {};
|
|
60
|
+
client.dispatchOpenUIAction(surfaceId, event, options);
|
|
61
|
+
onAction?.(event, current);
|
|
62
|
+
}, [
|
|
63
|
+
client,
|
|
64
|
+
mapAction,
|
|
65
|
+
onAction,
|
|
66
|
+
onOpenUrl,
|
|
67
|
+
surfaceId
|
|
68
|
+
]);
|
|
69
|
+
const handleStateUpdate = (0, react.useCallback)((state) => {
|
|
70
|
+
if (!client.updateSurfaceFromOpenUIState(surfaceId, state)) return;
|
|
71
|
+
const current = client.getSurface(surfaceId);
|
|
72
|
+
if (current) onStateUpdate?.(state, current);
|
|
73
|
+
}, [
|
|
74
|
+
client,
|
|
75
|
+
onStateUpdate,
|
|
76
|
+
surfaceId
|
|
77
|
+
]);
|
|
78
|
+
if (!surface) return null;
|
|
79
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_openuidev_react_lang.Renderer, {
|
|
80
|
+
response: surface.source,
|
|
81
|
+
library,
|
|
82
|
+
initialState,
|
|
83
|
+
isStreaming,
|
|
84
|
+
onAction: handleAction,
|
|
85
|
+
onStateUpdate: handleStateUpdate,
|
|
86
|
+
onParseResult,
|
|
87
|
+
onError,
|
|
88
|
+
toolProvider: toolProvider ?? agentToolProvider,
|
|
89
|
+
queryLoader
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//#endregion
|
|
93
|
+
exports.A2UIRenderer = A2UIRenderer;
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.cjs","names":["dataModelToOpenUIState","toJsonObject","BuiltinActionType","OpenUIRenderer"],"sources":["../src/Renderer.tsx"],"sourcesContent":["import {\n BuiltinActionType,\n type ActionEvent,\n type OpenUIError,\n type ParseResult,\n} from \"@openuidev/lang-core\";\nimport {\n Renderer as OpenUIRenderer,\n type Library,\n type RendererProps as OpenUIRendererProps,\n} from \"@openuidev/react-lang\";\nimport { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport type { A2UIClient } from \"./client\";\nimport { dataModelToOpenUIState, toJsonObject } from \"./json-pointer\";\nimport type { MapOpenUIAction, OpenUIActionOptions, SurfaceSnapshot } from \"./types\";\n\nexport interface A2UIRendererProps {\n client: A2UIClient;\n surfaceId: string;\n library: Library;\n mapAction?: MapOpenUIAction;\n onAction?: (event: ActionEvent, surface: SurfaceSnapshot) => void;\n /** Handles OpenUI @OpenUrl locally. Defaults to window.open in browsers. */\n onOpenUrl?: (url: string, event: ActionEvent, surface: SurfaceSnapshot) => void;\n onStateUpdate?: (state: Record<string, unknown>, surface: SurfaceSnapshot) => void;\n onParseResult?: (result: ParseResult | null) => void;\n onError?: (errors: OpenUIError[]) => void;\n /** Whether the surrounding A2UI transport is still delivering this agent turn. */\n isStreaming?: boolean;\n /** Additional top-level data-model keys that should hydrate form namespaces. */\n formStateKeys?: readonly string[];\n toolProvider?: OpenUIRendererProps[\"toolProvider\"];\n queryLoader?: OpenUIRendererProps[\"queryLoader\"];\n}\n\nfunction collectFormStateKeys(result: ParseResult | null): string[] {\n const keys = new Set<string>();\n const seen = new WeakSet<object>();\n const visit = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const item of value) visit(item);\n return;\n }\n if (!value || typeof value !== \"object\" || seen.has(value)) return;\n seen.add(value);\n const object = value as Record<string, unknown>;\n if (object.type === \"element\" && object.typeName === \"Form\") {\n const props = object.props as Record<string, unknown> | undefined;\n if (typeof props?.name === \"string\") keys.add(props.name);\n }\n for (const child of Object.values(object)) visit(child);\n };\n visit(result?.root);\n return [...keys];\n}\n\nexport function A2UIRenderer({\n client,\n surfaceId,\n library,\n mapAction,\n onAction,\n onOpenUrl,\n onStateUpdate,\n onParseResult,\n onError,\n isStreaming = false,\n formStateKeys,\n toolProvider,\n queryLoader,\n}: A2UIRendererProps) {\n const subscribe = useCallback((notify: () => void) => client.subscribe(notify), [client]);\n const getSnapshot = useCallback(() => client.getSurface(surfaceId), [client, surfaceId]);\n const surface = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const initialState = useMemo(() => {\n if (!surface) return undefined;\n const keys = new Set([...collectFormStateKeys(surface.parseResult), ...(formStateKeys ?? [])]);\n return dataModelToOpenUIState(surface.dataModel, keys);\n }, [formStateKeys, surface]);\n const agentToolProvider = useMemo<NonNullable<OpenUIRendererProps[\"toolProvider\"]>>(\n () => ({\n async callTool({\n name,\n arguments: args,\n }: {\n name: string;\n arguments?: Record<string, unknown>;\n }) {\n const value = await client.callAgentFunction({\n surfaceId,\n call: name,\n args: toJsonObject(args),\n });\n return { content: [], structuredContent: value };\n },\n }),\n [client, surfaceId],\n );\n\n const handleAction = useCallback(\n (event: ActionEvent) => {\n const current = client.getSurface(surfaceId);\n if (!current) return;\n if (event.type === BuiltinActionType.OpenUrl) {\n const url = event.params?.url;\n if (typeof url === \"string\") {\n if (onOpenUrl) onOpenUrl(url, event, current);\n else if (typeof window !== \"undefined\") window.open(url, \"_blank\", \"noopener,noreferrer\");\n }\n onAction?.(event, current);\n return;\n }\n const options: OpenUIActionOptions = mapAction?.(event, current) ?? {};\n client.dispatchOpenUIAction(surfaceId, event, options);\n onAction?.(event, current);\n },\n [client, mapAction, onAction, onOpenUrl, surfaceId],\n );\n\n const handleStateUpdate = useCallback(\n (state: Record<string, unknown>) => {\n if (!client.updateSurfaceFromOpenUIState(surfaceId, state)) return;\n const current = client.getSurface(surfaceId);\n if (current) onStateUpdate?.(state, current);\n },\n [client, onStateUpdate, surfaceId],\n );\n\n if (!surface) return null;\n\n return (\n <OpenUIRenderer\n response={surface.source}\n library={library}\n initialState={initialState}\n isStreaming={isStreaming}\n onAction={handleAction}\n onStateUpdate={handleStateUpdate}\n onParseResult={onParseResult}\n onError={onError}\n toolProvider={toolProvider ?? agentToolProvider}\n queryLoader={queryLoader}\n />\n );\n}\n"],"mappings":";;;;;;;AAmCA,SAAS,qBAAqB,QAAsC;CAClE,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,uBAAO,IAAI,SAAiB;CAClC,MAAM,SAAS,UAAyB;AACtC,MAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,QAAK,MAAM,QAAQ,MAAO,OAAM,KAAK;AACrC;;AAEF,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,KAAK,IAAI,MAAM,CAAE;AAC5D,OAAK,IAAI,MAAM;EACf,MAAM,SAAS;AACf,MAAI,OAAO,SAAS,aAAa,OAAO,aAAa,QAAQ;GAC3D,MAAM,QAAQ,OAAO;AACrB,OAAI,OAAO,OAAO,SAAS,SAAU,MAAK,IAAI,MAAM,KAAK;;AAE3D,OAAK,MAAM,SAAS,OAAO,OAAO,OAAO,CAAE,OAAM,MAAM;;AAEzD,OAAM,QAAQ,KAAK;AACnB,QAAO,CAAC,GAAG,KAAK;;AAGlB,SAAgB,aAAa,EAC3B,QACA,WACA,SACA,WACA,UACA,WACA,eACA,eACA,SACA,cAAc,OACd,eACA,cACA,eACoB;CACpB,MAAM,aAAA,GAAA,MAAA,cAAyB,WAAuB,OAAO,UAAU,OAAO,EAAE,CAAC,OAAO,CAAC;CACzF,MAAM,eAAA,GAAA,MAAA,mBAAgC,OAAO,WAAW,UAAU,EAAE,CAAC,QAAQ,UAAU,CAAC;CACxF,MAAM,WAAA,GAAA,MAAA,sBAA+B,WAAW,aAAa,YAAY;CACzE,MAAM,gBAAA,GAAA,MAAA,eAA6B;AACjC,MAAI,CAAC,QAAS,QAAO,KAAA;EACrB,MAAM,OAAO,IAAI,IAAI,CAAC,GAAG,qBAAqB,QAAQ,YAAY,EAAE,GAAI,iBAAiB,EAAE,CAAE,CAAC;AAC9F,SAAOA,qBAAAA,uBAAuB,QAAQ,WAAW,KAAK;IACrD,CAAC,eAAe,QAAQ,CAAC;CAC5B,MAAM,qBAAA,GAAA,MAAA,gBACG,EACL,MAAM,SAAS,EACb,MACA,WAAW,QAIV;AAMD,SAAO;GAAE,SAAS,EAAE;GAAE,mBAAmB,MALrB,OAAO,kBAAkB;IAC3C;IACA,MAAM;IACN,MAAMC,qBAAAA,aAAa,KAAK;IACzB,CAAC;GAC8C;IAEnD,GACD,CAAC,QAAQ,UAAU,CACpB;CAED,MAAM,gBAAA,GAAA,MAAA,cACH,UAAuB;EACtB,MAAM,UAAU,OAAO,WAAW,UAAU;AAC5C,MAAI,CAAC,QAAS;AACd,MAAI,MAAM,SAASC,qBAAAA,kBAAkB,SAAS;GAC5C,MAAM,MAAM,MAAM,QAAQ;AAC1B,OAAI,OAAO,QAAQ;QACb,UAAW,WAAU,KAAK,OAAO,QAAQ;aACpC,OAAO,WAAW,YAAa,QAAO,KAAK,KAAK,UAAU,sBAAsB;;AAE3F,cAAW,OAAO,QAAQ;AAC1B;;EAEF,MAAM,UAA+B,YAAY,OAAO,QAAQ,IAAI,EAAE;AACtE,SAAO,qBAAqB,WAAW,OAAO,QAAQ;AACtD,aAAW,OAAO,QAAQ;IAE5B;EAAC;EAAQ;EAAW;EAAU;EAAW;EAAU,CACpD;CAED,MAAM,qBAAA,GAAA,MAAA,cACH,UAAmC;AAClC,MAAI,CAAC,OAAO,6BAA6B,WAAW,MAAM,CAAE;EAC5D,MAAM,UAAU,OAAO,WAAW,UAAU;AAC5C,MAAI,QAAS,iBAAgB,OAAO,QAAQ;IAE9C;EAAC;EAAQ;EAAe;EAAU,CACnC;AAED,KAAI,CAAC,QAAS,QAAO;AAErB,QACE,iBAAA,GAAA,kBAAA,KAACC,sBAAAA,UAAD;EACE,UAAU,QAAQ;EACT;EACK;EACD;EACb,UAAU;EACV,eAAe;EACA;EACN;EACT,cAAc,gBAAgB;EACjB;EACb,CAAA"}
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { P as SurfaceSnapshot, T as MapOpenUIAction, t as A2UIClient } from "./client-D0JsJgUP.cjs";
|
|
2
|
+
import { ActionEvent, OpenUIError, ParseResult } from "@openuidev/lang-core";
|
|
3
|
+
import * as _$react from "react";
|
|
4
|
+
import { Library, RendererProps } from "@openuidev/react-lang";
|
|
5
|
+
|
|
6
|
+
//#region src/Renderer.d.ts
|
|
7
|
+
interface A2UIRendererProps {
|
|
8
|
+
client: A2UIClient;
|
|
9
|
+
surfaceId: string;
|
|
10
|
+
library: Library;
|
|
11
|
+
mapAction?: MapOpenUIAction;
|
|
12
|
+
onAction?: (event: ActionEvent, surface: SurfaceSnapshot) => void;
|
|
13
|
+
/** Handles OpenUI @OpenUrl locally. Defaults to window.open in browsers. */
|
|
14
|
+
onOpenUrl?: (url: string, event: ActionEvent, surface: SurfaceSnapshot) => void;
|
|
15
|
+
onStateUpdate?: (state: Record<string, unknown>, surface: SurfaceSnapshot) => void;
|
|
16
|
+
onParseResult?: (result: ParseResult | null) => void;
|
|
17
|
+
onError?: (errors: OpenUIError[]) => void;
|
|
18
|
+
/** Whether the surrounding A2UI transport is still delivering this agent turn. */
|
|
19
|
+
isStreaming?: boolean;
|
|
20
|
+
/** Additional top-level data-model keys that should hydrate form namespaces. */
|
|
21
|
+
formStateKeys?: readonly string[];
|
|
22
|
+
toolProvider?: RendererProps["toolProvider"];
|
|
23
|
+
queryLoader?: RendererProps["queryLoader"];
|
|
24
|
+
}
|
|
25
|
+
declare function A2UIRenderer({
|
|
26
|
+
client,
|
|
27
|
+
surfaceId,
|
|
28
|
+
library,
|
|
29
|
+
mapAction,
|
|
30
|
+
onAction,
|
|
31
|
+
onOpenUrl,
|
|
32
|
+
onStateUpdate,
|
|
33
|
+
onParseResult,
|
|
34
|
+
onError,
|
|
35
|
+
isStreaming,
|
|
36
|
+
formStateKeys,
|
|
37
|
+
toolProvider,
|
|
38
|
+
queryLoader
|
|
39
|
+
}: A2UIRendererProps): _$react.JSX.Element | null;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { A2UIRenderer, type A2UIRendererProps };
|
|
42
|
+
//# sourceMappingURL=react.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.cts","names":[],"sources":["../src/Renderer.tsx"],"mappings":";;;;;;UAgBiB,iBAAA;EACf,MAAA,EAAQ,UAAA;EACR,SAAA;EACA,OAAA,EAAS,OAAA;EACT,SAAA,GAAY,eAAA;EACZ,QAAA,IAAY,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,eAAA;EAFhC;EAIT,SAAA,IAAa,GAAA,UAAa,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,eAAA;EACvD,aAAA,IAAiB,KAAA,EAAO,MAAA,mBAAyB,OAAA,EAAS,eAAA;EAC1D,aAAA,IAAiB,MAAA,EAAQ,WAAA;EACzB,OAAA,IAAW,MAAA,EAAQ,WAAA;EAHoC;EAKvD,WAAA;EAJ0D;EAM1D,aAAA;EACA,YAAA,GAAe,aAAA;EACf,WAAA,GAAc,aAAA;AAAA;AAAA,iBAwBA,YAAA,CAAA;EACd,MAAA;EACA,SAAA;EACA,OAAA;EACA,SAAA;EACA,QAAA;EACA,SAAA;EACA,aAAA;EACA,aAAA;EACA,OAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA;AAAA,GACC,iBAAA,GAAiB,OAAA,CAAA,GAAA,CAAA,OAAA"}
|
package/dist/react.d.mts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { P as SurfaceSnapshot, T as MapOpenUIAction, t as A2UIClient } from "./client-QtfEE14J.mjs";
|
|
2
|
+
import { ActionEvent, OpenUIError, ParseResult } from "@openuidev/lang-core";
|
|
3
|
+
import { Library, RendererProps } from "@openuidev/react-lang";
|
|
4
|
+
import * as _$react from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/Renderer.d.ts
|
|
7
|
+
interface A2UIRendererProps {
|
|
8
|
+
client: A2UIClient;
|
|
9
|
+
surfaceId: string;
|
|
10
|
+
library: Library;
|
|
11
|
+
mapAction?: MapOpenUIAction;
|
|
12
|
+
onAction?: (event: ActionEvent, surface: SurfaceSnapshot) => void;
|
|
13
|
+
/** Handles OpenUI @OpenUrl locally. Defaults to window.open in browsers. */
|
|
14
|
+
onOpenUrl?: (url: string, event: ActionEvent, surface: SurfaceSnapshot) => void;
|
|
15
|
+
onStateUpdate?: (state: Record<string, unknown>, surface: SurfaceSnapshot) => void;
|
|
16
|
+
onParseResult?: (result: ParseResult | null) => void;
|
|
17
|
+
onError?: (errors: OpenUIError[]) => void;
|
|
18
|
+
/** Whether the surrounding A2UI transport is still delivering this agent turn. */
|
|
19
|
+
isStreaming?: boolean;
|
|
20
|
+
/** Additional top-level data-model keys that should hydrate form namespaces. */
|
|
21
|
+
formStateKeys?: readonly string[];
|
|
22
|
+
toolProvider?: RendererProps["toolProvider"];
|
|
23
|
+
queryLoader?: RendererProps["queryLoader"];
|
|
24
|
+
}
|
|
25
|
+
declare function A2UIRenderer({
|
|
26
|
+
client,
|
|
27
|
+
surfaceId,
|
|
28
|
+
library,
|
|
29
|
+
mapAction,
|
|
30
|
+
onAction,
|
|
31
|
+
onOpenUrl,
|
|
32
|
+
onStateUpdate,
|
|
33
|
+
onParseResult,
|
|
34
|
+
onError,
|
|
35
|
+
isStreaming,
|
|
36
|
+
formStateKeys,
|
|
37
|
+
toolProvider,
|
|
38
|
+
queryLoader
|
|
39
|
+
}: A2UIRendererProps): _$react.JSX.Element | null;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { A2UIRenderer, type A2UIRendererProps };
|
|
42
|
+
//# sourceMappingURL=react.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.mts","names":[],"sources":["../src/Renderer.tsx"],"mappings":";;;;;;UAgBiB,iBAAA;EACf,MAAA,EAAQ,UAAA;EACR,SAAA;EACA,OAAA,EAAS,OAAA;EACT,SAAA,GAAY,eAAA;EACZ,QAAA,IAAY,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,eAAA;EAFhC;EAIT,SAAA,IAAa,GAAA,UAAa,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,eAAA;EACvD,aAAA,IAAiB,KAAA,EAAO,MAAA,mBAAyB,OAAA,EAAS,eAAA;EAC1D,aAAA,IAAiB,MAAA,EAAQ,WAAA;EACzB,OAAA,IAAW,MAAA,EAAQ,WAAA;EAHoC;EAKvD,WAAA;EAJ0D;EAM1D,aAAA;EACA,YAAA,GAAe,aAAA;EACf,WAAA,GAAc,aAAA;AAAA;AAAA,iBAwBA,YAAA,CAAA;EACd,MAAA;EACA,SAAA;EACA,OAAA;EACA,SAAA;EACA,QAAA;EACA,SAAA;EACA,aAAA;EACA,aAAA;EACA,OAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA;AAAA,GACC,iBAAA,GAAiB,OAAA,CAAA,GAAA,CAAA,OAAA"}
|