{"version":3,"sources":["../src/ui/protocol.ts"],"names":[],"mappings":"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","file":"chunk-SRPPJOB2.cjs","sourcesContent":["export interface ChatUIResource {\n  id: string;\n  kind: string;\n  attributes: Record<string, unknown>;\n}\n\nexport interface ChatUIAction {\n  id?: string;\n  kind: string;\n  resourceId?: string;\n  label?: string;\n  payload: Record<string, unknown>;\n}\n\nexport interface ChatUISuggestion {\n  label: string;\n  value: string;\n}\n\nexport interface NormalizedChatUI {\n  version: \"1\";\n  resources: ChatUIResource[];\n  actions: ChatUIAction[];\n  suggestions: ChatUISuggestion[];\n}\n\nexport interface ChatUIRenderer<T = unknown> {\n  kind: string;\n  render(resource: ChatUIResource, actions: ChatUIAction[]): T;\n}\n\nexport interface ChatUIRendererRegistry<T = unknown> {\n  register(renderer: ChatUIRenderer<T>): () => void;\n  render(resource: ChatUIResource, actions: ChatUIAction[]): T | undefined;\n  has(kind: string): boolean;\n}\n\nfunction text(value: unknown, max = 200): string {\n  return typeof value === \"string\" ? value.trim().slice(0, max) : \"\";\n}\n\nexport function normalizeChatUI(value: unknown): NormalizedChatUI | null {\n  if (!value || typeof value !== \"object\") return null;\n  const candidate = value as Record<string, unknown>;\n  if (String(candidate.version) !== \"1\") return null;\n\n  const resources = (Array.isArray(candidate.resources) ? candidate.resources : [])\n    .map((item): ChatUIResource | null => {\n      if (!item || typeof item !== \"object\") return null;\n      const record = item as Record<string, unknown>;\n      const id = text(record.id, 128);\n      const kind = text(record.kind, 64);\n      if (!id || !kind) return null;\n      const attributes =\n        record.attributes && typeof record.attributes === \"object\"\n          ? (record.attributes as Record<string, unknown>)\n          : {};\n      return { id, kind, attributes };\n    })\n    .filter((item): item is ChatUIResource => item !== null)\n    .slice(0, 20);\n\n  const resourceIDs = new Set(resources.map((resource) => resource.id));\n  const actions = (Array.isArray(candidate.actions) ? candidate.actions : [])\n    .map((item): ChatUIAction | null => {\n      if (!item || typeof item !== \"object\") return null;\n      const record = item as Record<string, unknown>;\n      const kind = text(record.kind, 64);\n      const resourceId = text(record.resource_id, 128) || undefined;\n      if (!kind || (resourceId && !resourceIDs.has(resourceId))) return null;\n      return {\n        id: text(record.id, 128) || undefined,\n        kind,\n        resourceId,\n        label: text(record.label, 80) || undefined,\n        payload:\n          record.payload && typeof record.payload === \"object\"\n            ? (record.payload as Record<string, unknown>)\n            : {},\n      };\n    })\n    .filter((item): item is ChatUIAction => item !== null)\n    .slice(0, 40);\n\n  const suggestions = (Array.isArray(candidate.suggestions) ? candidate.suggestions : [])\n    .map((item): ChatUISuggestion | null => {\n      if (!item || typeof item !== \"object\") return null;\n      const record = item as Record<string, unknown>;\n      const label = text(record.label, 100);\n      const suggestionValue = text(record.value, 500);\n      return label && suggestionValue ? { label, value: suggestionValue } : null;\n    })\n    .filter((item): item is ChatUISuggestion => item !== null)\n    .slice(0, 5);\n\n  return { version: \"1\", resources, actions, suggestions };\n}\n\nexport function createChatUIRendererRegistry<T = unknown>(\n  initial: ChatUIRenderer<T>[] = [],\n): ChatUIRendererRegistry<T> {\n  const renderers = new Map(initial.map((renderer) => [renderer.kind, renderer]));\n  return {\n    register(renderer) {\n      renderers.set(renderer.kind, renderer);\n      return () => {\n        if (renderers.get(renderer.kind) === renderer) renderers.delete(renderer.kind);\n      };\n    },\n    render(resource, actions) {\n      return renderers.get(resource.kind)?.render(\n        resource,\n        actions.filter((action) => action.resourceId === resource.id),\n      );\n    },\n    has: (kind) => renderers.has(kind),\n  };\n}\n"]}